UVA 558 判断负环 By ACReaper

本文介绍了一个使用Bellman-Ford算法检测图中是否存在负权重环的问题实例。通过C++实现,详细展示了如何构建邻接表并进行Bellman-Ford算法迭代,最终判断是否有负环存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哎,好久没切题了,今天又来切题鸟,一定要坚持!!!至少每天一题!

这题本质就是判断图中有没有负环。我的第一反应就是用Bellman-ford算法解决,代码如下


#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 1006;
const int INF = 0x2fffffff;
vector<pii> G[maxn];
int d[maxn];
int main()
{
    int t,n,m;
    int len_adj = -1;
    bool tag_haveWormHole = false;
    scanf("%d",&t);
    
    for(int i = 1; i <= t; i++){
	  //pre process start
	  len_adj = -1;
      tag_haveWormHole = false;
      for(int j = 0; j < maxn; j++)
		 d[j] = INF;
      d[0] = 0;
      for(int j = 0; j < maxn; j++)
         G[j].clear();
	  //pre process end
      scanf("%d%d",&n,&m);
      for(int j = 0; j < m; j++){//Build Adj Graph
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         G[u].push_back(make_pair(v,w));
	     if(u > len_adj)
            len_adj = u;
      }
      
      //Bellford-man-algorithm
      for(int i1 = 1; i1 <= n - 1; i1++){
		for(int j = 0; j <= len_adj; j++){//哎,len_adj因是adj的最大的下标不是大小!,在这坑了
	      for(int k = 0; k < G[j].size(); k++){
				int u = j;
                int v = G[j][k].first;
                int w = G[j][k].second;
	//			printf("v = %d,u = %d, w = %d,d[v] = %d\n",v,u,w,d[v]);
                if(d[v] > d[u] + w){
				  d[v] = d[u] + w;
			//	  printf("d[%d] = %d ",v,d[v]); 
				} 
			}
		 }
//		printf("#%d end\n",i1);
	
	 }
	 // puts("");
	  //output test
	  
	  //for(int i1 = 0; i1 < 5 ;i1++)
		//  printf("d[%d] = %d ",i1,d[i1]);
 //     puts("");

	  //output test end
    for(int j = 0; j < len_adj;j++){
	for(int k = 0; k < G[j].size(); k++){
		   int u = j;
           int v = G[j][k].first;
           int w = G[j][k].second;
           if(d[v] >d[u] + w){
           	tag_haveWormHole = true;
             }
      	}
    } 
   if(tag_haveWormHole)
	 puts("possible");
   else
	puts("not possible");
  }
    return 0;
}
2013 05 30

By ACReaper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值