#include <iostream>
#include <fstream>
#define ADJUST 0.00000001
using namespace std;
struct E
{
int start;
int end;
double r;
double c;
}e[108*108*2];
double v[108];
int m,n,s;
double origin;
void solved()
{
int j;
origin=v[s];
bool flag;
while(v[s]-origin<=ADJUST)
{
flag=false;
for(j=1;j<=m*2;j++)
{
if(v[e[j].end]-(v[e[j].start]-e[j].c)*e[j].r<-ADJUST)
{
v[e[j].end]=(v[e[j].start]-e[j].c)*e[j].r;
flag=true;
}
}
if(!flag)
{
if(v[s]-origin>ADJUST)
{
cout<<"YES"<<endl;
return;
}
else
{
cout<<"NO"<<endl;
return;
}
}
}
cout<<"YES"<<endl;
}
int main()
{
//ifstream cin("1.txt");
int i,j;
for(i=0;i<108;i++)
v[i]=0.0;
cin>>n>>m>>s;
cin>>v[s];
for(i=0,j=1;i<m;i++,j+=2)
{
int a,b;
double rab,rba,cab,cba;
cin>>a>>b>>rab>>cab>>rba>>cba;
e[j].start=a;
e[j].end=b;
e[j].r=rab;
e[j].c=cab;
e[j+1].start=b;
e[j+1].end=a;
e[j+1].r=rba;
e[j+1].c=cba;
}
solved();
return 0;
}
注意:
1、所开数组e的大小
2、bellman算法不再能松弛时结束
3、v[e[j].end]-(v[e[j].start]-e[j].c)*e[j].r<-ADJUST,ADJUST用负号
4、数据类型不要搞错



被折叠的 条评论
为什么被折叠?



