题意:班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] <= k,k >= 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值;
最短路问题,就是求有向图最短路,因为假设2比1最多多2个,3比2最多多3个,1比3最多多4个,假如选择1->2->3则3比1最多多5个不符合1比3最多多4个这个条件,因此选择最短路;其实还是请教lsh才明白怎么做用数组建图以及用数组模拟spfa的队列过程;还是太菜- -#
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=150005;
int dis[maxn],vis[maxn],head[maxn];
int n,m;
struct edgenode
{
int to;
int w;
int next;
}edge[maxn];
int ip;
void add(int u,int v,int w)
{
edge[ip].to=v,edge[ip].w=w,edge[ip].next=head[u],head[u]=ip++;
}
void spfa(int s)
{
int u,t;
int q[maxn];
q[t++]=s;
dis[s]=0;
vis[s]=1;
while(t)
{
u=q[--t];
vis[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(dis[edge[i].to]>(dis[u]+edge[i].w))
{
dis[edge[i].to]=(dis[u]+edge[i].w);
if(!vis[edge[i].to])
{
q[t++]=edge[i].to;
vis[edge[i].to]=1;
}
}
}
}
}
int main()
{
int a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
ip=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
for(int i=1;i<=n;i++)
dis[i]=99999999;
spfa(1);
printf("%d\n",dis[n]);
}
return 0;
}