1. 程式人生 > 其它 >poj1860 spfa判斷正環

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); }