码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1860

时间:2015-07-22 23:04:30      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:acm   poj   最短路   

需要判断是否有正权环存在,Bellman-Ford算法就可以辣~

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Edge
{
  int u,v;
  double r,c;
}edge[210];
int n,m,s,k;
double w;
double d[105];
int bellmanford()
{
  for(int i=1;i<=n;i++)
  d[i]=0.0;
  d[s]=w;
  int i;
  for(i=1;i<=n;i++)
  {
    bool flag = false;
    for(int j=1;j<k;j++)
   {
    int x=edge[j].u;
    int y=edge[j].v;
    if(d[y]<(d[x]-edge[j].c)*edge[j].r)
	{
	  flag = true ;
	  d[y] = (d[x]-edge[j].c)*edge[j].r;
	}
   }
   if(!flag) return false;
  }
  for(int i=1;i<k;i++)
  {
    if(d[edge[i].v]<((d[edge[i].u]-edge[i].c)*edge[i].r))
	return true;
  }
  return false;
}
int main()
{
	while(scanf("%d%d%d%lf",&n,&m,&s,&w)!=EOF)
    {
     int a,b;
     double rab,cab,rba,cba;
     k=1;
     while(m--)
	 {
	   scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);
	   edge[k].u=a;
	   edge[k].v=b;
	   edge[k].r=rab;
	   edge[k].c=cab;
	   k++;
	   edge[k].u=b;
	   edge[k].v=a;
	   edge[k].r=rba;
	   edge[k].c=cba;
	   k++;
	 }
	 int ans=bellmanford();
	 if(ans) printf("YES\n");
	 else printf("NO\n");
    }

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 1860

标签:acm   poj   最短路   

原文地址:http://blog.csdn.net/mowenwen_/article/details/47009175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!