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;
}