头像

欢迎来到我的博客

分享题解与总结

Bellman-Ford边集数组

模版:

struct edge{int u,v,w;};
int n,m,starti,t,u0,v0,w0,idx,d[N];
struct edge e[M];

void bellmanFord(int s)
{
for(int i=1;i<=n;++i) d[i]=INF;
d[s]=0;

for(int i=1;i<n;++i){//一共n-1轮循环
flag=false;
for(int j=1;j<=idx;++j){//遍历idx条边
u1=e[j].u,v1=e[j].v,w1=e[j].w;
if(d[u1]!=INF&&d[u1]+w1<d[v1]){
d[v1]=d[u1]+w1;
flag=true;
}
}
if(flag==false) break;
}

for(int j=1;j<=idx;++j){//检测负权环
u1=e[j].u,v1=e[j].v,w1=e[j].w;
if(d[u1]!=INF&&d[u1]+w1<d[v1])
cout<<"YES"<<'\n';
}
cout<<"NO"<<'\n';
}

int main()
{
starti=1;
cin>>n>>m;
for(int i=1;i<=m;++i){
cin>>u0>>v0>>w0;
if(w0>=0){
e[++idx]={u0,v0,w0};
e[++idx]={v0,u0,w0};
}
else e[++idx]={u0,v0,w0};
}
bellmanFord(starti);
}

posted @ 2026-02-26 10:17  king_steph1209  阅读(6)  评论(0)    收藏  举报