题意是说...有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;
}