poj-3159,SPFA+堆栈

来源:互联网 发布:云计算 中国科学院 编辑:程序博客网 时间:2024/05/29 11:06

题目连接

分析:本题是通过最短路径来求差分约束问题。关于差分约束问题,为什么可以用最短路来求解。可以到网上找。

求最短路径,这题因为点比较多,所以用spfa写方便些。不过用列队会溢出,用循环列队会超时,所以这题可以用栈来实现。即节省空间,又可省时间。

代码:(弱弱地参考别人代码)

#include<cstdio>#include<cstring>#include<stack>#define INF 1000000using 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;}


原创粉丝点击