题意:
小孩A认为小孩B比自己多出的最多不会超过c个糖果,也就是 B - A <= c,正好符合差分约束方程,就是A到B的边权w(A, B) = c;用 SPFA + 栈 能过。
这题目,应该也算是差分约束的基础题吧,只不过用SPFA+队列实现超时了,无语呀
#include<iostream> #define MAXINT 9999999 #define MAXN 30010 using namespace std; int vis[MAXN],dis[MAXN],n,num,m; int root[MAXN],stack[MAXN]; struct edge { int u,w,next; }e[MAXN*5]; void spfa() { int top=0; for(int i=1;i<=n;i++) { dis[i]=MAXINT; } dis[1]=0; stack[++top]=1; vis[1]=1; while(top) { int t=stack[top--],tmp; vis[t]=0; for(int j=root[t];j!=-1;j=e[j].next) { tmp=e[j].u; if(dis[tmp]>dis[t]+e[j].w) { dis[tmp]=dis[t]+e[j].w; if(!vis[tmp]) { vis[tmp]=1; stack[++top]=tmp; } } } } } int main() { int a,b,c; cin>>n>>m;num=0; memset(root,-1,sizeof(root)); memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&c); e[num].u=b; e[num].w=c; e[num].next=root[a]; root[a]=num++; } spfa(); cout<<dis[n]<<endl; }