左上角點為(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)的窩裡,現在它們要跑到右下解(n,m)的窩中去,狼王開始伏擊這些兔子.當然為了保險起見,如果一條道路上最多通過的兔子數為k,狼王需要安排同樣數量的k只狼,才能完全封鎖這條道路,你需要幫助狼王安排乙個伏擊方案,使得在將兔子一網打盡的前提下,參與的狼的數量要最小。因為狼還要去找喜羊羊麻煩.
第一行為n,m.表示網格的大小,n,m均小於等於1000.接下來分三部分 第一部分共n行,每行m-1個數,表示橫向道路的權值.
第二部分共n-1行,每行m個數,表示縱向道路的權值. 第三部分共n-1行,每行m-1個數,表示斜向道路的權值. 輸入保證不超過10m
輸出乙個整數,表示參與伏擊的狼的最小數量.
3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
圖論,搜尋,最短路徑
暴力就是裸地最大流,但點數與邊數都達到了很大的級別,普通的網路流也過不去;可以發現這個題的圖是乙個平面圖:邊不會交叉;有乙個性質,就是在原圖g中,s
與t再連一條邊得到的較小的那個平面作為
s』,最大的面
(另乙個面)作為
t』,做出對偶圖:原圖中所有面看為點,所有邊所相鄰的兩個面在對偶圖所對應的點連一條邊,然後從g』中
s到t的最短路就是原圖的最大流;證明略;
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12 #include13 #include14
#define ll long long
15#define rep(i,a,b) for(register int i=a;i<=b;i++)
16#define inf 1<<29
17#define re register
18using
namespace
std;
19const
int n=1000*1000*2,m=1000*1000*3;20
struct
edgee[m*2
];23
int head[n],num_e=-1
,n,m;
24int
s,t;
25int g[1001][1001][2
];26 inline int
gi()
33 inline void add(int x,int y,int
w) 36
bool
inq[n];
37int
dis[n];
38int
spfa() 54}
55}56return
dis[t];57}
58int
main()
76 rep(i,1,n-1
)77 rep(j,1
,m)
84 rep(i,1,n-1
)85 rep(j,1,m-1
) 90
//cout<
91 printf("%d"
,spfa());
92return0;
93 }
P4001 BJOI2006 狼抓兔子
不少題解都是用網路流來做最小割 網路流是什麼 但對於乙個不會網路流的蒟蒻來做這題相當困難。聽機房daolao說可以重構圖做最短路。然後就baidu將平面圖轉換成乙個對偶圖,因為網路流的最小割 對偶圖的最短路,所以只要在對偶圖上跑最短路 從左上角跑到右下角 就行了。由於堆優化的dijkstra寫炸了,...
BJOI2006 狼抓兔子
現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形 左上角點為 1,1 右下角點為 n,m 上圖中n 3,m 4 有以下三種型別的道路 1 x,y x 1,y 2 x,y x,y 1 3...
BJOI2006 狼抓兔子
求乙個網格圖的最小割。這個題一看就知道是乙個最小割模型,於是就快樂的打了dinic,也就快樂的tle了。查了查資料才知道,這個題要用到對偶圖的知識 平面圖最小割對應對偶圖最短路。所謂對偶圖,就是以原圖中的面作為點 將s,t連線以將無界區域分成兩部分 原圖中的邊在對偶圖中變為連線相鄰的面,於是,顯然對...