标签:正环 double atm son spfa poj1860 include change
——一切都回来了,用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。