链式前向星 37分求助
查看原帖
链式前向星 37分求助
358283
Crab_time楼主2023/2/28 18:58

已经用邻接表通过。想尝试使用链式前向星,但不知道如何调。

目前错误的点都是WA

基于邻接表的代码改来,怀疑在转换这两种存图方式上有问题。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

#define fle(i,a,b) for(int i = a;i<=(b);i++)
#define ll long long
#define MAXN 5e3 + 5
#define MAXM 5e3 + 5

ll head[(int)(MAXN)],ver[(int)(MAXM)],edge[(int)(MAXM)],nex[(int)(MAXM)],from[(int)(MAXM)];
ll dis[(int)(MAXN)];
bool v[(int)(MAXN)];
ll n,m,tot,s;

void add(int x,int y,int z){
	ver[++tot] = y,edge[tot] = z;
	nex[tot] = head[x], head[x] = tot;
    from[tot] = x;
}

bool bellmanford(int ss){
    fle(i,1,n){dis[i] = 1e9;}
    dis[ss] = 0;
    fle(i,1,n){
        for(int j = head[i];j;j = nex[j]){
            int v = ver[j],f = from[j];
            dis[v] = min(dis[v],dis[f] + edge[j]);
        }
    }
    fle(i,1,n){
        for(int j = head[i];j;j = nex[j]){
            int v = ver[j],f = from[j];
            if(dis[f] + edge[j] < dis[v]){return false;}
        }
    }
    return true;
}

int main()
{
    scanf("%d %d",&n,&m);
    fle(i,1,m){
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        add(v,u,w);
    }
    if(bellmanford(1)){
        fle(i,1,n){
            printf("%d ",dis[i]);
        }
    }
    else{
        printf("NO");
    }
    return 0;
}
2023/2/28 18:58
加载中...