Problem Description
输入n,m,s,v,分别代表n中货币类型,m中兑换渠道,自己拥有的货币类型,自己拥有货币价值。接下来m行,每行a,b,rab,cab,rba,cba.分别代表a类型货币,b类型货币,a-b兑换率,a-b手续费,b-a兑换率,b-a手续费。
**思路:判断自己拥有的货币类型出发,回到自己看看有没有正权回路,有就输出YES。
#include<cstdio>
#include<cstring>
struct node
{
int a, b;
double rab, cab;
};
node e[205];
int n, m, s, cnt;
double dist[105];
double v;
int bellman_Ford()
{
memset(dist, 0, sizeof(dist));
dist[s] = v;
int i, j;
for(i = 0; i < n - 1; i++)
{
int flag = 0;
for(j = 0; j < cnt; j++)
{
if(dist[e[j].b] < (dist[e[j].a] - e[j].cab) * e[j].rab)
{
dist[e[j].b] = (dist[e[j].a] - e[j].cab) * e[j].rab;
flag = 1;
}
}
if(!flag) break;//如果不更新了退出循环,降低时间复杂度
}
//判断是否有正权回路
for(j = 0; j < cnt; j++)
{
if(dist[e[j].b] < (dist[e[j].a] - e[j].cab) * e[j].rab)
return 0;//还能更新,有正权回路
}
return 1;
}
int main()
{
int a, b;
double rab, cab, rba, cba;
while(~scanf("%d %d %d %lf", &n, &m, &s, &v))
{
cnt = 0;
while(m--)
{
scanf("%d %d %lf %lf %lf %lf", &a, &b, &rab, &cab, &rba, &cba);
e[cnt].a = a;
e[cnt].b = b;
e[cnt].rab = rab;
e[cnt++].cab = cab;
e[cnt].a = b;
e[cnt].b = a;
e[cnt].rab = rba;
e[cnt++].cab = cba;
}
if(bellman_Ford()) printf("NO\n");
else printf("YES\n");
}
return 0;
}