poj1860 spfa判斷正環
阿新 • • 發佈:2021-10-05
——一切都回來了,用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; structnode{ 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); }