参考:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html
题意:班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:
题意:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] <= k,k >= 0。要求在满足这些条件的
题意:情况下,求出p[n] - p[1]的最大值。
分析:由参考可知,即求p[n]——>p[1]的最短路
SPFA+Stack
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <queue>
using namespace std;
#define N 30010
#define M 150010
#define INF 99999999
int n,m;
int head[N],tot;
stack<int>s;
int dis[N];
bool vis[N];
struct Node{
int to,val,next;
}node[M];
void add(int u,int v,int w){
node[tot].to=v;
node[tot].val=w;
node[tot].next=head[u];
head[u]=tot++;
}
void spfa(){
dis[1]=0;vis[1]=0;
s.push(1);
while(!s.empty()){
int cur=s.top(); s.pop();
vis[cur]=0;
for(int i=head[cur];i!=-1;i=node[i].next)
if(dis[node[i].to]>dis[cur]+node[i].val){
dis[node[i].to]=dis[cur]+node[i].val;
if(!vis[node[i].to]){
vis[node[i].to]=1;
s.push(node[i].to);
}//if
}//if
}//while
}
int main(){
int a,b,c;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
} spfa();
printf("%d",dis[n]);
return 0;
}