1.Codeforces 20C
spfa算法的简单题,在这个过程中多了一个记录连接最短路径上的前一个节点的位置的数组,然后将这个数组逆向输出
在这道题目中,我路径数组范围居然忘记*2了,结果一直报错,找了好久,%>_<%
#include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; #define N 100010 #define LL long long LL dp[N]; int first[N],visit[N],k,n,f[N],r[N]; struct Path{ int y,d,next; }path[2*N]; void add(int a,int b,int c) { path[k].y=b,path[k].d=c,path[k].next=first[a]; first[a]=k; k++; } bool spfa(int src) { bool judge=false; memset(dp,-1,sizeof(dp)); memset(f,0,sizeof(f)); memset(visit,0,sizeof(visit)); queue<int> q; dp[src]=0,visit[src]=1; q.push(src); while(!q.empty()){ int u=q.front(); q.pop(); visit[u]=0; for(int i=first[u];i!=-1;i=path[i].next){ if(dp[path[i].y]==-1||dp[path[i].y]>dp[u]+path[i].d){ dp[path[i].y]=dp[u]+path[i].d; f[path[i].y]=u; if(!visit[path[i].y]) { visit[path[i].y]=1,q.push(path[i].y); if(path[i].y==n) judge=true; } } } } return judge; } int main() { int m,a,b,c; while(scanf("%d%d",&n,&m)!=EOF){ k=0; memset(first,-1,sizeof(first)); for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } if(!spfa(1)){ printf("-1\n"); continue; } int cnt=0; for(int i=n;i!=0;i=f[i]) r[cnt++]=i; for(int i=cnt-1;i>=1;i--) printf("%d ",r[i]); printf("%d\n",r[0]); } return 0; }