题意是说...有N个小朋友..每个人有糖果..给出M给关于两两手中糖果数关系..a b c 代表b手中的糖果不会比a打出c个..求小朋友间两人差距可能最大会是多少...
抽象来就是给出 M 个关系 a - b <= c 之类的..然后求两两之差最大的值....这道题不会卡建图..用SPFA也没必要用超级点或者先把所有点入列...
但这道题用SPFA十分蛋疼的是用queue会超时...用stack就过了~~至今不知道为什么....实在SPFA用queue和stack应该是没区别的....
Prgram:
#include<iostream> #include<stack> #define MAXN 30001 using namespace std; struct p1 { int x,y,next,k; }line[MAXN*10]; int n,m,i,link[MAXN]; stack<int> mystack; int SPFA() { int k,h,i,d[MAXN]; bool used[MAXN]; while (!mystack.empty()) mystack.pop(); memset(used,false,sizeof(used)); memset(d,0x7F,sizeof(d)); d[1]=0; mystack.push(1); while (!mystack.empty()) { h=mystack.top(); mystack.pop(); used[h]=false; k=link[h]; while (k) { if (d[line[k].y]>d[h]+line[k].k) { d[line[k].y]=d[h]+line[k].k; if (!used[line[k].y]) { used[line[k].y]=true; mystack.push(line[k].y); } } k=line[k].next; } } return d[n]; } int main() { while(~scanf("%d%d",&n,&m)) { memset(link,0,sizeof(link)); for (i=1;i<=m;i++) { scanf("%d%d%d",&line[i].x,&line[i].y,&line[i].k); line[i].next=link[line[i].x]; link[line[i].x]=i; } printf("%d\n",SPFA()); } return 0; }