poj1860 spfa判断正环
作者:互联网
——一切都回来了,用csj的话。
这货上次在群里说一道spfa判负环的题改半天,改出来的那刻觉得一切都回来了。
hh,都想起来了吗,在机房被支配的恐惧和ac的快乐。
#
觉得这个n可以用弗洛伊德,但觉得弗洛伊德维护不了那么复杂的情况
#
写了一个dij——
那么问题来了,dij的板子里有一个是vis数组,用来标记是否用过,那我这个魔改过的版本,到底是加or不加?
加的话会妨碍其他节点的更新,不加的话会变得很大很大——怎么判断大到什么程度?
#
正解是spfa(spfa你终于活了)判断正环的模板题。
有个小smart power是只要存在环,无论有无该货币点都可以,因为可以换无数次后再兑换回去,仍然是降维打击。
..一切都回来了啊。
-----
还没ac,但困,待填。20211005;
#include <iostream> #include <math.h> #include <string.h> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; double n,m,v,s; struct node{ double rab,cab,rba,cba; }atm[maxn]; struct lys{ double v,s,id; }; //RAB, CAB, RBA and CBA void dij(double v,double s) { for(int i=1;i<=maxn;i++) { d[i][0]=-20211002.0; d[i][1]=-20211002.0; } double ans; lys start; start.v=v; start.s=s; ans=start.v; while(!q.empty( )) { lys now; now=q.front( ); //从now这个atm出来 ,身上的币种 q.pop( ); for(int i=1;i<=m;i++) { if(atm[i].a==now.s) { double change; change=(now.v-cab)*rab; if(change-d[i][1]>0.000001) { d[i][1]=change; lys son; son.s=atm[i].b; son.v=d[i][1]; son.id=i; q.push(son); if(atm[i].b==s) ans=max(ans,change); } } if(atm[i].b==now.s) { double change; change=(now.v-cba)*rba; if(change-d[i][0]>0.000001) { d[i][0]=change; lys son; son.s=atm[i].a; son.v=d[i][0]; son.id=i; q.push(son); if(atm[i].b==s) ans=max(ans,change); } } } } } int main( ) { cin>>n>>m>>s>>v; for(int i=1;i<=m;i++) { scanf("%lf%lf%lf%lf%lf%lf",&atm[i].a,&atm[i].b,&atm[i].rab,&atm[i].cab,&atm[i].rba,&atm[i].cba); } dij(v,s); }
标签:正环,double,atm,son,spfa,poj1860,include,change 来源: https://www.cnblogs.com/liyishui2003/p/15368981.html