http://acm.timus.ru/problem.aspx?space=1&num=1162
被这句话害了 "Let us call some sequence of the exchange operations simple if no exchange point is used more than once in this sequence."
根本没有意义 直径 spfa 就行
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include <iomanip>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
const int N=106;
int head[N],I;
struct node
{
double r,c;
int j,next;
}side[N*2];
double dist[N];
void add(int i,int j,double r,double c)
{
side[I].j=j;
side[I].c=c;
side[I].r=r;
side[I].next=head[i];
head[i]=I++;
}
bool spfa(int s,double k,int n)
{
int num[N];
bool in[N];
memset(num,0,sizeof(num));
memset(in,false,sizeof(in));
queue<int>qt;
for(int i=1;i<=n;++i)
dist[i]=0.0;
dist[s]=k;
qt.push(s);
num[s]=1;
while(!qt.empty())
{
int x=qt.front();qt.pop();
in[x]=false;
if(x==s&&dist[x]>k)
return true;
for(int t=head[x];t!=-1;t=side[t].next)
{
int j=side[t].j;
if(dist[j]<(dist[x]-side[t].c)*side[t].r)
{
dist[j]=(dist[x]-side[t].c)*side[t].r;
while(!in[j])
{
++num[j];
if(num[j]>=n)
return true;
in[j]=true;
qt.push(j);
}
}
}
}
return false;
}
int main()
{
//freopen("data.in","r",stdin);
int n,m,s;
double k;
while(cin>>n>>m>>s>>k)
{
memset(head,-1,sizeof(head));
I=0;
while(m--)
{
int a,b;
double rab,cab,rba,cba;
cin>>a>>b>>rab>>cab>>rba>>cba;
add(a,b,rab,cab);
add(b,a,rba,cba);
}
if(spfa(s,k,n))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}