poj 1860 Currency Exchange

#include <iostream>            //Bellman-Ford算法的变形,参照 poj 2240 Arbitrage
using namespace std;
const int maxnum = 102;
int n,m,s,a,b;
double v,r1,c1,r2,c2;
typedef
struct Edge
{
int u, v;
double ex,com;
}Edge;

Edge edge[
1000];
double dist[maxnum];
int nodenum, edgenum;

void input()
{
cin
>>n>>m>>s>>v;
memset(dist,
0,sizeof(dist));
dist[s]
=v;
nodenum
=n;edgenum=2*m;
int i,j=1;
for(i=1; i<=m; ++i)
{
cin
>>a>>b>>r1>>c1>>r2>>c2;
edge[j].u
=a;
edge[j].v
=b;
edge[j].ex
=r1;edge[j++].com=c1;
edge[j].u
=b;
edge[j].v
=a;
edge[j].ex
=r2;edge[j++].com=c2;
}
}
bool relax(int u, int v, double e,double c)
{
if(dist[v] < (dist[u]-c) * e ) //这里是小于号
{
dist[v]
= (dist[u]-c) * e ;
return 1;
}
return 0;
}
bool Bellman_Ford()
{
int tag=1;
for(int i=1; i<=nodenum; ++i)
{
tag
=1;
for(int j=1; j<=edgenum; ++j)
if(relax(edge[j].u, edge[j].v, edge[j].ex , edge[j].com))
tag
=0;
if(tag==1)
break;
}
// 判断是否有正权回路
for(int i=1; i<=edgenum; ++i)
if(dist[edge[i].v] < (dist[edge[i].u]-edge[i].com) * edge[i].ex) //这里是小于号
return 1;
return 0;
}
int main()
{
int t=1;
int tag=0;
input();
if(Bellman_Ford())
printf(
"YES\n");
else
printf(
"NO\n");
return 0;
}

  

posted on 2011-07-22 20:28  sysu_mjc  阅读(169)  评论(0编辑  收藏  举报

导航