麻烦吴彦祖们帮我看看,bellman只有最后两个点过了
查看原帖
麻烦吴彦祖们帮我看看,bellman只有最后两个点过了
952574
hua_nong_first_caibi楼主2023/3/20 09:51
#include<cstdio>
#include<string>
#include<vector>
#include<iostream>

using namespace std;

struct Node{
int v,di;//v为顶点,di为边长
};

vector<Node>Adj[2001];
//邻接表,Adj[i]存放从i出发的边
int n,m;
int d[2001];

bool Beelman(){
    fill(d,d+2001,100000);
    d[1]=0;

    for(int i=0;i<n-1;i++){
        for(int j=1;j<=n;j++){
            for(int k=0;k<Adj[j].size();k++){
                int v=Adj[j][k].v;
                int distance=Adj[j][k].di;
                if(d[v]!=100000&&d[v]>d[j]+distance){
                    d[v]=d[j]+distance;
                }
            }
        }
    }

        for(int j=1;j<=n;j++){
            for(int k=0;k<Adj[j].size();k++){
                int v=Adj[j][k].v;
                int distance=Adj[j][k].di;
                if(d[v]!=100000&&d[v]>d[j]+distance){
                    return true;
                    //如果有1可以到达的负环,返回true
                }
            }
        }
        return false;//没有可以到的负环,返回false
}

int main(){
   int k;
   scanf("%d",&k);
   while(k--){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        Adj[i].clear();
    for(int i=0;i<m;i++){
    //存放边数据
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        Node node;
        node.v=b;
        node.di=c;
        Adj[a].push_back(node);

    }
        if(Beelman())
            printf("YES\n");
        else
            printf("NO\n");

   }
   return 0;
}
2023/3/20 09:51
加载中...