POJ 1860 SPFA

来源:互联网 发布:d80军刀图纸数据 编辑:程序博客网 时间:2024/06/05 16:47
这题我看到网上很多人都用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;elsereturn 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;elsecout<<"NO"<<endl;}

0 0