已经用邻接表通过。想尝试使用链式前向星,但不知道如何调。
目前错误的点都是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;
}