zl程序教程

您现在的位置是:首页 >  后端

当前栏目

bellman-ford算法

2023-09-14 09:06:47 时间
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5+2e3,M= 5 + 6e3;
class Edge{
public:
    int u,v,w;
}edge[M];
int dis[N];
int cnt=0;
int n;
void add_edge(int u,int v,int w){
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt++].w=w;
}
bool bellman_ford(){
    dis[1]=1;
    for(int i=0;i<n-1;++i){
        bool flag=false;
        for(int j=0;j<cnt;++j){
            int u=edge[j].u,v=edge[j].v,w=edge[j].w;
            if(dis[u]>=0x3f3f3f3f)continue;
            w+=dis[u];
            if(w<dis[v]){
                dis[v]=w;
                flag=true;
            }
        }
        if(!flag)return false;
    }
    for(int j=0;j<cnt;++j){
        int u=edge[j].u,v=edge[j].v,w=edge[j].w;
        if(dis[u]>=0x3f3f3f3f)continue;
        w+=dis[u];
        if(w<dis[v])return true;
    }
    return false;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int m;
        scanf("%d%d",&n,&m);
        memset(dis,0x3f,sizeof(dis));
        cnt=0;
        while(m--){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v,w);
            if(w>=0)add_edge(v,u,w);
        }
        if(bellman_ford())printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}