P4001 BJOI2006 狼抓兔子

2022-04-29 03:12:11 字數 1637 閱讀 9752

不少題解都是用網路流來做最小割(網路流是什麼),但對於乙個不會網路流的蒟蒻來做這題相當困難。

聽機房daolao說可以重構圖做最短路。然後就baidu將平面圖轉換成乙個對偶圖,因為網路流的最小割 = 對偶圖的最短路,所以只要在對偶圖上跑最短路(從左上角跑到右下角)就行了。

由於堆優化的dijkstra寫炸了,冒著「死亡」的風險碼了個spfa的最短路,開了o2竟然卡進800ms。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 2000005

#define inf 0x3f3f3f3f

intcnt,n,m,w;

inthead[maxn],vis[maxn],dis[maxn];

queue

q;struct

hht[maxn

<<2

];inline

intread()

if(kr=='

-') xs=0-xs;

return

xs;}

inline

void clear()//

初始化

inline

void add(int nex,int to,int dis)//

前向星建圖

; head[nex]=cnt++;

t[cnt]=hh;

head[to]=cnt++;

}inline

void getmap()//

將平面圖轉換為對偶圖

for(int i=2;ii)

}if(n>=2

)

for(int j=1;jj)

for(int i=1;ii)

}for(int i=1;ii)

}}int

main()

if(ans==inf) ans=0;//

特判只有全圖只有乙個點的情況

printf("

%d\n

",ans);

return0;

}getmap();

dis[

0]=0;vis[0]=1;//

編號為 0 的點為起始點(左上角)

q.push(0

);

while(!q.empty())}}

}printf(

"%d\n

",dis[2*(m-1)*(n-1)+1]);//

(2*(m-1)*(n-1)+1)號點為終點(右下角)

return0;

}

因為蒟蒻水平有限,ac這題借鑑了兩位大佬的bolg:

①littlerewriter

(洛谷題解)

②kafuuchino

(機房的crk大佬)

Luogu 4001 BJOI2006 狼抓兔子

bzoj 1001 並不會這個trick,所以筆記要詳細一點。前置知識 平面圖轉對偶圖 傳送門 聽說直接 dinic 就好了,還跑得比正解快 首先我們按照平面圖的定義,把網格圖中所有的平面以及另加的起點和終點在新圖中標號,一共有 n 1 m 1 2 2 個點,標完樣例之後大概是這樣子的 然後我們接著...

P2030 BJOI2006 狼抓兔子

左上角點為 1,1 右下角點為 n,m 上圖中n 4,m 5 有以下三種型別的道路 1 x,y x 1,y 2 x,y x,y 1 3 x,y x 1,y 1 道路上的權值表示這條路上最多能夠通過的兔子數,道路是無向的.左上角和右下角為兔子的兩個窩,開始時所有的兔子都聚集在左上角 1,1 的窩裡,現...

BJOI2006 狼抓兔子

現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形 左上角點為 1,1 右下角點為 n,m 上圖中n 3,m 4 有以下三種型別的道路 1 x,y x 1,y 2 x,y x,y 1 3...