这题我看到网上很多人都用Bellman flod 写,但是我想能用Bellman flod 的一定可以用spfa 写,spfa 明显效率高很多,但是这题并不是一个标准的最短路,标准的是求最短路,判断是否有负环,这个相反,让你判断是否有正环,同理,不过是将初值都设为无穷小,求最大路就行了,判断条件是,因为如果有正环的话,就跳不出循环,所以标记一个变量,最多会有多少次,假设极端情况,每个点豆入队n次。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const double inf=-10000000.0;
int m,n,s;
double v,d[110];
queue<int> q;
struct NODE
{
int x;
int y;
double c;
double r;
}e[300];
bool spfa()
{
int count,i,u;
for(i=1;i<=n;i++)
d[i]=inf;
d[s]=v;
q.push(s);
count=0;
while(!q.empty())
{
if(count>n*n)
break;
u=q.front();
q.pop();
count++;
for(i=1;i<=2*m;i++)
if(e[i].x==u&&(d[u]-e[i].c)*e[i].r>d[e[i].y])
{
d[e[i].y]=(d[u]-e[i].c)*e[i].r;
q.push(e[i].y);
}
}
if(count>n*n)
return true;
else
return false;
}
int main()
{
int a,b,i,j;
double r1,r2,c1,c2;
bool re;
cin>>n>>m>>s>>v;
j=1;
for(i=0;i<m;i++)
{
cin>>a>>b;
cin>>r1>>c1>>r2>>c2;
e[j].x=a;
e[j].y=b;
e[j].c=c1;
e[j++].r=r1;
e[j].x=b;
e[j].y=a;
e[j].c=c2;
e[j++].r=r2;
}
re=spfa();
if(re)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}