/*hdu 3592的原题少了一个输入控制。。。 hdu的题解我有些详解的*/ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int INF = 1<<26; struct node{ int y,w,next; }edge[150005]; int dis[10010],n,m1,edgeHead[10010],stack[100010],m2,cot[10010]; bool vis[10010]; bool spfa(){//下表为1开始 for(int i = 2; i <= n; i ++) { dis[i] = INF; cot[i] = 0; } dis[1] = 0; int top = 0; // spfa的堆栈实现模板。 stack[++ top] = 1; vis[1] = true; while(top){ int x = stack[top --]; cot[x]++; if(cot[x]>n) return false; for(int p = edgeHead[x]; p != 0; p = edge[p].next){ int y = edge[p].y; if(dis[y] > dis[x] + edge[p].w){ dis[y] = dis[x] + edge[p].w; if(!vis[y]){ vis[y] = true; stack[++ top] = y; } } } vis[x] = false; } return true; } int main() { int i,j,t; int x,y,v,k=1; while(scanf("%d %d %d",&n,&m1,&m2)!=EOF) { for(i=1;i<=n;i++) { edge[i].next=0; edgeHead[i]=0; } for(i=1;i<=m1;i++)//d[y]-d[x]<=c { scanf("%d %d %d",&x,&y,&v); edge[k].y=y; edge[k].w=v; edge[k].next=edgeHead[x]; edgeHead[x]=k++; } for(i=1;i<=m2;i++)//d[y]-d[x]>=c => d[x]-d[y]<=-c { scanf("%d %d %d",&x,&y,&v); edge[k].y=x; edge[k].w=-v; edge[k].next=edgeHead[y]; edgeHead[y]=k++; } for(i=1;i<=n;i++) { edge[k].y=i; edge[k].w=0; edge[k].next=edgeHead[i+1]; edgeHead[i+1]=k++; } int ans; if(!spfa()) ans = -1; else if(dis[n] == INF) ans = -2; else ans=dis[n]; printf("%d\n",ans); } return 0; }
转载于:https://blog.51cto.com/8590696/1358863