为何建立超级原点反而错误了呢?
查看原帖
为何建立超级原点反而错误了呢?
585201
6lszxz楼主2022/7/19 21:12

这是没建立超级原点时候的代码:

#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分,不知道为什么捏

2022/7/19 21:12
加载中...