http://poj.org/problem?id=1860
题意:A和B交换率相等(双向图),每次交换需要小费(可以交换多次),问经过一系列交换后(最后需要换回最开始的那种货币),资金能否增长?
分析:寻找正权回路
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
using namespace std;
const int NM=105;
double dis[NM];
int n,m;
struct Node{
int x,y;
double r,c;
}q[NM<<1];
bool Bellman_Ford(int s,double v)
{
int i,j;
memset(dis,0,sizeof(dis));
dis[s]=v;
for(i=0;i<n;i++){
for(j=0;j<2*m;j++){
if(dis[q[j].y]<(dis[q[j].x]-q[j].c)*q[j].r)
dis[q[j].y]=(dis[q[j].x]-q[j].c)*q[j].r;
}
}
for(j=0;j<2*m;j++){
if(dis[q[j].y]<(dis[q[j].x]-q[j].c)*q[j].r)
return true;
}
return false;
}
int main()
{
int s,i;
double v;
while(~scanf("%d%d%d%lf",&n,&m,&s,&v))
{
for(i=0;i<m;i++){
scanf("%d%d%lf%lf%lf%lf",&q[i].x,&q[i].y,&q[i].r,&q[i].c,&q[i+m].r,&q[i+m].c);
q[i+m].x=q[i].y;q[i+m].y=q[i].x;
}
if(Bellman_Ford(s,v)) printf("YES\n");
else printf("NO\n");
}
return 0;
}