分析:本题是通过最短路径来求差分约束问题。关于差分约束问题,为什么可以用最短路来求解。可以到网上找。
求最短路径,这题因为点比较多,所以用spfa写方便些。不过用列队会溢出,用循环列队会超时,所以这题可以用栈来实现。即节省空间,又可省时间。
代码:(弱弱地参考别人代码)
#include<cstdio> #include<cstring> #include<stack> #define INF 1000000 using namespace std; struct node{ int x,w,next; }edge[150005]; bool visit[30005]; int d[30005],head[30005]; int N,M; void spfa() { int i,k; stack<int>S; memset(visit,0,sizeof(visit)); for(i=2;i<=N;i++) d[i]=INF; d[1]=0; S.push(1),visit[1]=1; while(!S.empty()){ k=S.top(); S.pop(); visit[k]=0; for(i=head[k];i!=-1;i=edge[i].next){ if(d[edge[i].x]>edge[i].w+d[k]){ d[edge[i].x]=edge[i].w+d[k]; if(!visit[edge[i].x]){ S.push(edge[i].x); visit[edge[i].x]=1; } } } } printf("%d\n",d[N]); } int main() { int x,w,v,i; while(scanf("%d%d",&N,&M)!=EOF){ memset(head,-1,sizeof(head)); for(i=1;i<=M;i++){ scanf("%d%d%d",&x,&w,&v); edge[i].x=w; edge[i].w=v; edge[i].next=head[x]; head[x]=i; } spfa(); } return 0; }