这是没建立超级原点时候的代码:
#include "cstdio"
#include "cstring"
struct edge{
int l;
int r;
int v;
};
edge es[5003];
int dis[5003];
bool is = false;
int main(){
memset(dis,0x3f3f3f3f,sizeof dis);
dis[1] =0;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
es[i] = {y,x,z};
}
for(int i=1;i<=m-1;i++){
for(int j=1;j<=m;j++){
if(dis[es[j].l] + es[j].v <dis[es[j].r]){
dis[es[j].r] = dis[es[j].l] + es[j].v;
}
}
}
for(int i=1;i<=m;i++){
if(dis[es[i].l] + es[i].v <dis[es[i].r]){
printf("NO");
return 0;
}
}
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
}
可以AC 这是在建立了超级原点之后的代码:
#include "cstdio"
#include "cstring"
struct edge{
int l;
int r;
int v;
};
edge es[10006];
int dis[5003];
bool is = false;
int main(){
memset(dis,0x3f3f3f3f,sizeof dis);
dis[0] =0;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
es[i] = {i,0,0};
}
for(int i=n+1;i<=n+m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
es[i] = {y,x,z};
}
for(int i=1;i<=n+m-1;i++){
for(int j=1;j<=n+m;j++){
if(dis[es[j].l] + es[j].v <dis[es[j].r]){
dis[es[j].r] = dis[es[j].l] + es[j].v;
}
}
}
for(int i=1;i<=m;i++){
if(dis[es[i].l] + es[i].v <dis[es[i].r]){
printf("NO");
}
}
if(!is){
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
} else{
printf("NO");
}
}
只能拿73分,不知道为什么捏