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;
}


 
View Code

相关文章:

  • 2021-10-08
  • 2021-07-16
  • 2021-08-27
  • 2021-11-12
  • 2021-08-15
  • 2021-08-27
  • 2022-03-04
  • 2021-08-27
猜你喜欢
  • 2021-06-18
  • 2022-02-04
  • 2021-09-20
  • 2022-12-23
  • 2021-08-31
  • 2020-07-17
  • 2022-02-15
相关资源
相似解决方案