这是一个用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;
}
posted on 2011-04-06 21:46  海浪涛天  阅读(206)  评论(0编辑  收藏  举报