不标记,直至起始位置的dis大于初始即为YES,还有一种做法是判断某一点的遍历次数是否大于n,若大于n,即为有回环
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e6+10;
const int MAX=2000+10;
const int inf = 0X3f3f3f3f;
//最短路径-----dijkstra的stl优化 时间复杂度O(elog(v))
int n, m, s;
double v;
double dis[MAX];
int first[MAX], num;
int vis[MAX];
struct EDGE{
int v, next;
double c, r;
}edge[MAXN*2]; //链式向前星
typedef pair<int,int>P; //stl储存
void init(){
fill(dis, dis+n+1, 0); //memset只能初始化-1,0,1
memset(first,-1,sizeof(first));
memset(vis, 0, sizeof(vis));
num=0;
}
void addedge(int u,int v, double c, double r){
edge[num].v=v;
edge[num].c=c;
edge[num].r=r;
edge[num].next=first[u];
first[u]=num++;
}
int dijkstra(int s,int g)
{
priority_queue<P,vector<P>,greater<P> >q;
q.push(P(v, s));
dis[s] = v;
// vis[s] = 1;//有回环,不标记
while(!q.empty()){
// cout << dis[s] << ":" << v << endl;
if(dis[s] > v)
return 1;
P t=q.top();
q.pop();
int u=t.second;
// if(vis[u]) continue;
// vis[u] = 1;
// cout << endl << u << "--";
for(int i=first[u]; i!=-1; i=edge[i].next){
int v = edge[i].v; //cout << v << ":" <<dis[v] << "-->";
double c = edge[i].c;
double r = edge[i ].r;
if(dis[v] < (dis[u]-c)*r){
dis[v] = (dis[u]-c)*r;
// cout << dis[v] << "up" ;
q.push(P(dis[v],v));
}
}
}
return 0;
}
int main(){
int T;
int flag=1;
while(cin >> n >> m >> s >> v){
init();
memset(vis, 0, sizeof(vis));
int u, v;
double r, rr, c, rc;
for(int i=1;i<=m;i++){
cin >> u >> v >> r >> c >> rr >> rc;
addedge(u, v, c, r);
addedge(v, u, rc, rr);
}
printf("%s\n", dijkstra(s,n) ? "YES" : "NO");
}
return 0;
}