#include <iostream>
#include<stdio.h>
#define M 3000
#define inf 1<<29
using namespace std;
int n,m,w;
struct
{
int x,y,t;
}edge[M];
int bellman()
{
int i,j,d[505];
int flag=1,sum=1;
for(i=1;i<=n;i++)
d[i]=inf;
while(flag)
{
flag=0;
if(sum++>n)
return 1;
for(i=1;i<=m;i++)
{
if(d[edge[i].x]+edge[i].t<d[edge[i].y])
{
d[edge[i].y]=d[edge[i].x]+edge[i].t;
flag=1;
}
if(d[edge[i].y]+edge[i].t<d[edge[i].x])
{
d[edge[i].x]=d[edge[i].y]+edge[i].t;
flag=1;
}
}
for(i=m+1;i<=m+w;i++)
if(d[edge[i].y]>d[edge[i].x]-edge[i].t)
{
d[edge[i].y]=d[edge[i].x]-edge[i].t; flag=1;
}
}
return 0;
}
int main()
{
int t ,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&w);
for(i=1;i<=m+w;i++)
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].t);
if(bellman())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include<stdio.h>
#define M 3000
#define inf 1<<29
using namespace std;
int n,m,w;
struct
{
int x,y,t;
}edge[M];
int bellman()
{
int i,j,d[505];
int flag=1,sum=1;
for(i=1;i<=n;i++)
d[i]=inf;
while(flag)
{
flag=0;
if(sum++>n)
return 1;
for(i=1;i<=m;i++)
{
if(d[edge[i].x]+edge[i].t<d[edge[i].y])
{
d[edge[i].y]=d[edge[i].x]+edge[i].t;
flag=1;
}
if(d[edge[i].y]+edge[i].t<d[edge[i].x])
{
d[edge[i].x]=d[edge[i].y]+edge[i].t;
flag=1;
}
}
for(i=m+1;i<=m+w;i++)
if(d[edge[i].y]>d[edge[i].x]-edge[i].t)
{
d[edge[i].y]=d[edge[i].x]-edge[i].t; flag=1;
}
}
return 0;
}
int main()
{
int t ,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&w);
for(i=1;i<=m+w;i++)
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].t);
if(bellman())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
Bellman算法解析
本文介绍了一个基于Bellman算法实现的程序,该程序用于解决带有负权边的最短路径问题,并通过迭代检查是否存在负权回路。代码展示了如何初始化距离数组、如何进行松弛操作以及如何判断是否存在负权回路。
6731

被折叠的 条评论
为什么被折叠?



