不少題解都是用網路流來做最小割(網路流是什麼),但對於乙個不會網路流的蒟蒻來做這題相當困難。
聽機房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...