最短パス練習-POJ 1860 Currency Exchange
1363 ワード
テーマ:
複数種類の為替レートは、為替レートの間で無限に変換(手数料が存在する)することができ、お金を増加させる経路があるかどうかを尋ねる.
考え方:
正重みループが存在するかどうかを判断し,belman‐Fordアルゴリズムの変異体を用いて緩和条件を変更した.
複数種類の為替レートは、為替レートの間で無限に変換(手数料が存在する)することができ、お金を増加させる経路があるかどうかを尋ねる.
考え方:
正重みループが存在するかどうかを判断し,belman‐Fordアルゴリズムの変異体を用いて緩和条件を変更した.
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAXINT 1100
#define MAXD 999999
struct edge{
int u, v;
double r, c;
}ed[MAXINT];
bool bellman_ford(int n, int v, double c, int e)
{
double d[MAXINT];
memset(d, 0, sizeof(d));
d[v] = c;
bool flag;
for (int i = 1; i < n; i++)
{
flag = false;
for (int j = 0; j < e; j++)
if (d[ed[j].v] < (d[ed[j].u] - ed[j].c)*ed[j].r)
{
d[ed[j].v] = (d[ed[j].u] - ed[j].c)*ed[j].r;
flag = true;
}
if (!flag)
break;
}
for (int i = 0; i < e; i++)
if (d[ed[i].v] < (d[ed[i].u] - ed[i].c)*ed[i].r)
return true;
return false;
}
int main(){
int n, m, s;
int x, y, e;
double v, r1, c1, r2, c2;
while (scanf("%d%d%d%lf", &n, &m, &s, &v) != EOF)
{
e = 0;
for (int i = 1; i <= m; i++)
{
scanf("%d%d%lf%lf%lf%lf", &x, &y, &r1, &c1, &r2, &c2);
ed[e].u = x;
ed[e].v = y;
ed[e].r = r1;
ed[e++].c = c1;
ed[e].u = y;
ed[e].v = x;
ed[e].r = r2;
ed[e++].c = c2;
}
if (bellman_ford(n, s, v, e))
printf("YES
");
else
printf("NO
");
}
return 0;
}