这是一个用bellman()判断有无负权环的题目,需要先对图中的每一个元素进行操作,最后判断负环是否存在。要注意有向图的边权是负数。具体见源程序:(PS:本题也可以用spfa来做,就是通过队列中元素的进出掌握每个节点的情况)
#include<stdio.h>
typedef struct
{
int a,b,t;
}node;
node road[6000];
int n,m,w,s,e,t,ep;
int bellman()
{
int dist[502],i,j,temp;
for(i=1;i<=n;i++)
dist[i]=0;
for(i=1;i<n;i++)
{
temp=0;
for(j=0;j<ep;j++)
{
if(dist[road[j].b]>dist[road[j].a]+road[j].t)/*负环条件
{
dist[road[j].b]=dist[road[j].a]+road[j].t;
temp=1;
}
}
if(temp==0)
break;
}
for(i=0;i<ep;i++)/*判断是否存在负权图
if(dist[road[i].b]>dist[road[i].a]+road[i].t)
return 1;
return 0;
}
int main()
{
int i,f;
scanf("%d",&f);
while(f--)
{
scanf("%d%d%d",&n,&m,&w);
ep=0;
for(i=0;i<m;i++)/*对无向图的操作
{
scanf("%d%d%d",&s,&e,&t);
road[ep].a=s;
road[ep].b=e;
road[ep].t=t;
ep++;
road[ep].a=e;
road[ep].b=s;
road[ep].t=t;
ep++;
}
for(i=0;i<w;i++)/*对有向图的操作
{
scanf("%d%d%d",&s,&e,&t);
road[ep].a=s;
road[ep].b=e;
t=t*(-1);
road[ep].t=t;
ep++;
}
if(bellman())
printf("YES\n");
else printf("NO\n");
}
return 0;
}
#include<stdio.h>
typedef struct
{
int a,b,t;
}node;
node road[6000];
int n,m,w,s,e,t,ep;
int bellman()
{
int dist[502],i,j,temp;
for(i=1;i<=n;i++)
dist[i]=0;
for(i=1;i<n;i++)
{
temp=0;
for(j=0;j<ep;j++)
{
if(dist[road[j].b]>dist[road[j].a]+road[j].t)/*负环条件
{
dist[road[j].b]=dist[road[j].a]+road[j].t;
temp=1;
}
}
if(temp==0)
break;
}
for(i=0;i<ep;i++)/*判断是否存在负权图
if(dist[road[i].b]>dist[road[i].a]+road[i].t)
return 1;
return 0;
}
int main()
{
int i,f;
scanf("%d",&f);
while(f--)
{
scanf("%d%d%d",&n,&m,&w);
ep=0;
for(i=0;i<m;i++)/*对无向图的操作
{
scanf("%d%d%d",&s,&e,&t);
road[ep].a=s;
road[ep].b=e;
road[ep].t=t;
ep++;
road[ep].a=e;
road[ep].b=s;
road[ep].t=t;
ep++;
}
for(i=0;i<w;i++)/*对有向图的操作
{
scanf("%d%d%d",&s,&e,&t);
road[ep].a=s;
road[ep].b=e;
t=t*(-1);
road[ep].t=t;
ep++;
}
if(bellman())
printf("YES\n");
else printf("NO\n");
}
return 0;
}