spfa。
#include<iostream>
#include <cstring>
#include <queue>
using namespace std;
int N, M, S;
double V;
int A, B;
double RAB, CAB, RBA, CBA;
struct Edge
{
int v, next;
double r, c;
} e[205];
int head[205], Count;
double d[205];
int n[205];
bool visited[205];
void add(int u, int v, double r, double c)
{
e[Count].v = v;
e[Count].r = r;
e[Count].c = c;
e[Count].next = head[u];
head[u] = Count ++;
}
bool spfa()
{
queue<int> Q;
d[S] = V;
Q.push(S);
visited[S] = true;
n[S] ++;
int p, q;
while(Q.size())
{
p = Q.front();
Q.pop();
visited[p] = false;
for(int i = head[p]; i != -1; i = e[i].next)
{
q = e[i].v;
if(d[q] < (d[p] - e[i].c) * e[i].r)
{
d[q] = (d[p] - e[i].c) * e[i].r;
if(!visited[q])
{
Q.push(q);
visited[q] = true;
n[q] ++;
if(n[q] > N)
return true;
}
}
}
}
if(d[S] > V)
return true;
return false;
}
int main()
{
memset(head, -1, sizeof(head));
cin >> N >> M >> S >> V;
for(int i = 0; i < M; i ++)
{
cin >> A >> B >> RAB >> CAB >> RBA >> CBA;
add(A, B, RAB, CAB);
add(B, A, RBA, CBA);
}
if(spfa())
cout << "YES" << endl;
else
cout << "NO" << endl;
// system("pause");
return 0;
}