题目地址:http://poj.org/problem?id=1860
这个题一道很简单的贝尔曼判环的应用,用贝尔曼判环挺方便的。因为把r,c定义成了整型,错了一晚上。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
int u, v;
double c, r;
} edge[10000];
double x, d[10000];
int n, s, k;
void bfff()
{
int i, j, flag, xx;
memset(d,0,sizeof(d));
d[s]=x;
for(i=0; i<n-1; i++)
{
flag=0;
for(j=0; j<k; j++)
{
if(d[edge[j].v]<(d[edge[j].u]-edge[j].c)*edge[j].r)
{
d[edge[j].v]=(d[edge[j].u]-edge[j].c)*edge[j].r;
flag=1;
}
}
if(!flag)
break;
}
xx=0;
for(i=0; i<k; i++)
{
if(d[edge[i].v]<(d[edge[i].u]-edge[i].c)*edge[i].r)
{
xx=1;
break;
}
}
if(xx)
printf("YES\n");
else
printf("NO\n");
}
int m, u, v;
int main()
{
double c1, c2, r1, r2;
scanf("%d%d%d%lf",&n,&m,&s,&x);
k=0;
while(m--)
{
scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2);
edge[k].u=u;
edge[k].v=v;
edge[k].r=r1;
edge[k++].c=c1;
edge[k].u=v;
edge[k].v=u;
edge[k].r=r2;
edge[k++].c=c2;
}
//printf("%d %d\n",edge[0].u,edge[0].v);
bfff();
return 0;
}