#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
int n,m,tot;
int head[1000];
bool vis[1000];
double dist[1000];
int num[1000];
double money;
struct bian
{
int v,next;
double tax,rate;
}edge[1000];
void add(int u,int v,double rate,double tax)
{
edge[tot].v=v;
edge[tot].rate=rate;
edge[tot].tax=tax;
edge[tot].next=head[u];
head[u]=tot++;
}
int spfa(int s)
{
queue<int>q;
memset(dist,0,sizeof(dist));
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
dist[s]=money;
q.push(s);
vis[s]=true;
num[s]++;
while(!q.empty())
{
int u=q.front();
q.pop();vis[u]=false;
for(int cur=head[u];cur!=-1;cur=edge[cur].next)
{
int v=edge[cur].v;
if(dist[v]<(dist[u]-edge[cur].tax)*edge[cur].rate)
{
dist[v]=(dist[u]-edge[cur].tax)*edge[cur].rate;
if(!vis[v])
{
vis[v]=true;
num[v]++;
if(num[v]>=n) return 1;
q.push(v);
}
}
}
}
return 0;
}
int main()
{
int a,b,s;
double ab,t1,ba,t2;
tot=0;
cin>>n>>m>>s>>money;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
cin>>a>>b>>ab>>t1>>ba>>t2;
add(a,b,ab,t1);
add(b,a,ba,t2);
}
if(spfa(s)) printf("YES\n");
else printf("NO\n");
return 0;
}
POJ1860Currency Exchange spfa
最新推荐文章于 2020-08-01 15:06:44 发布