题目来源:poj 1860
思路:
裸Bellman-Ford算法,只不过这里求的是最长路径。故松弛条件需要改变一下。如果经过N-1次松弛后还可以松弛,说明存在正环。
#include <iostream>
using namespace std;
const int maxn = 1010;
const int maxm = 110;
struct edge
{
int u;
int v;
double rate;
double cost;
} edge[2 * maxm];
int N, M, s;
double V;
double d[maxn];
bool Bellman_Ford()
{
fill(d, d + maxn, 0);
d[s] = V;
for (int i = 0; i < N - 1; i++)
{
bool flag = false;
for (int j = 0; j < 2 * M; j++)
{
double temp = (d[edge[j].u] - edge[j].cost) * edge[j].rate;
if (temp > d[edge[j].v])
{
flag = true;
d[edge[j].v] = temp;
}
}
if (!flag)
{
return false;
}
}
for (int j = 0; j < 2 * M; j++)
{
double temp = (d[edge[j].u] - edge[j].cost) * edge[j].rate;
if (temp > d[edge[j].v])
{
return true;
}
}
return false;
}
int main()
{
while (scanf("%d%d%d%lf", &N, &M, &s, &V) != EOF)
{
int A, B;
double RAB, CAB, RBA, CBA;
for (int i = 0; i < M; i++)
{
scanf("%d%d%lf%lf%lf%lf", &A, &B, &RAB, &CAB, &RBA, &CBA);
edge[i].u = A;
edge[i].v = B;
edge[i].rate = RAB;
edge[i].cost = CAB;
edge[i + M].u = B;
edge[i + M].v = A;
edge[i + M].rate = RBA;
edge[i + M].cost = CBA;
}
if (Bellman_Ford())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}