【BZOJ1001】【Beijing2006】狼抓兔子(平面圖轉對偶圖:最小割+最短路)
題目描述
題解
題目描述很明顯這就是一道最小割,不過跑最大流的話會TLE。
我們發現這是一個平面圖(什麼是平面圖?),那麼我們就可以參考平面圖轉對偶圖的思想,將這道題轉化成最短路。
可參考資料:對偶圖的應用
建圖的時候十分的麻煩。。。
程式碼
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max_n=1005;
const int max_m=1005;
const int max_N=max_n*max_m*2 +5;
const int max_e=3*max_n*max_m+5;
const int max_queue=max_N*2+5;
const int inf=2100000000;
int n,m,N,now,nowlast;
int heng[max_n][max_m],zong[max_n][max_m],xie[max_n][max_m];
int next[max_e*2],point[max_N],c[max_e*2],v[max_e*2],tot;
int dis[max_N],queue[max_queue+5],head,tail;
bool b[max_N];
inline void add(int x,int y,int val){
++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=val;
++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; c[tot]=val;
}
int main(){
scanf("%d%d",&n,&m);
//總點數
N=(n-1)*(m-1)*2+2;
//特判
if (n==1&&m==1){
printf("0\n");
return 0;
}
if (n==1){
int Min=inf,x;
for (int i=1;i<m;++i)
scanf("%d",&x),Min=min(Min,x);
printf("%d\n",Min);
return 0;
}
if (m==1){
int Min=inf,x;
for (int i=1;i<n;++i)
scanf("%d",&x),Min=min(Min,x);
printf("%d\n",Min);
return 0;
}
//read
for (int i=1;i<=n;++i)
for (int j=1;j<m;++j)
scanf("%d",&heng[i][j]);
for (int i=1;i<n;++i)
for (int j=1;j<=m;++j)
scanf("%d",&zong[i][j]);
for (int i=1;i<n;++i)
for (int j=1;j<m;++j)
scanf("%d",&xie[i][j]);
//build up
for (int i=1;i<n;++i)
for (int j=1;j<m;++j){
now=(i-1)*(m-1)+j;
//斜向
add(now*2,now*2+1,xie[i][j]);
//縱向
if (j!=1) add(now*2-1,now*2,zong[i][j]);
//橫向
if (i!=1){
nowlast=now-(m-1);
add(nowlast*2,now*2+1,heng[i][j]);
}
}
//S
for (int i=1;i<n;++i){
now=(i-1)*(m-1)+1;
add(1,now*2,zong[i][1]);
now=(i-1)*(m-1)+m-1;
add(now*2+1,N,zong[i][m]);
}
//T
for (int i=1;i<m;++i){
now=i;
add(now*2+1,N,heng[1][i]);
now=(n-2)*(m-1)+i;
add(1,now*2,heng[n][i]);
}
//SPFA
memset(dis,0x7f,sizeof(dis));
memset(b,0,sizeof(b));
dis[1]=0;
head=0; tail=1;
queue[tail]=1;
b[1]=true;
while (head!=tail){
head++;
now=queue[head%max_queue];
b[now]=false;
for (int i=point[now];i;i=next[i])
if (dis[v[i]]>dis[now]+c[i]){
dis[v[i]]=dis[now]+c[i];
if (!b[v[i]]){
tail++;
queue[tail%max_queue]=v[i];
b[v[i]]=true;
}
}
}
printf("%d\n",dis[N]);
}
相關推薦
【BZOJ1001】【Beijing2006】狼抓兔子(平面圖轉對偶圖:最小割+最短路)
題目描述 傳送門 題解 題目描述很明顯這就是一道最小割,不過跑最大流的話會TLE。 我們發現這是一個平面圖(什麼是平面圖?),那麼我們就可以參考平面圖轉對偶圖的思想,將這道題轉化成最短路。
【BZOJ1001】狼抓兔子(平面圖轉對偶圖,最短路,最小割)
題面 BZOJ 洛谷 題解 這題用最小割可以直接做 今天再學習了一下平面圖轉對偶圖的做法 大致的思路如下: 1.將源點到匯點中再補一條不與任何線段有交點的邊。這條邊把外側無限大的區域劃
洛谷P4001 [BJOI2006]狼抓兔子(平面圖轉對偶圖)
bool .html next fine pri n) www moto tdi 傳送門 明明只要最小割加點優化就能過的東西…… 然而我偏偏要去學平面圖轉對偶圖結果發現課件關鍵地方看不清->這裏 而且建圖累的半死…
【BZOJ】2007: [Noi2010]海拔(平面圖轉對偶圖)
using targe line problem max 最小 mem AR pop 題目 傳送門:QWQ 分析 左上角是0,右下角是1。那麽大概整張圖是由0 1構成的。 那麽我們要找到0和1的分界線,值就是最小割。 然後變成求原圖最小割。 考慮
【bzoj4423】[AMPPZ2013]Bytehattan(平面圖轉對偶圖+並查集)
題目傳送門:bzoj4423 如果是普通的刪邊判連通性,我們可以很顯然的想到把操作離線下來,倒著加邊。然而,這題強 制 在 線。 雖然如此,但是題目所給的圖是個平面圖。那麼我們把它轉成對偶圖試試看? 在對偶圖上,刪邊變成了加邊(把邊兩邊的網格連通起來)。並且,我們可以發現,如果在對偶圖上
狼抓兔子 HYSBZ - 1001 (平面圖轉對偶圖最短路求最小割)
狼抓兔子 HYSBZ - 1001 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形: 左上角點為(1,1),右下角點為(
【BZOJ1001】【BJOI2006】狼抓兔子(對偶圖,最短路)
Description 現在小朋友們最喜歡的”喜羊羊與灰太狼”,話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:
【BZOJ 1001】狼抓兔子(最大流)
ron define max \n 效率 cpp cstring inf tchar 題目鏈接 最大流裸題,沒什麽好說吧,恰好點數多,考驗網絡流的效率,正好練\(Dinic\)。 #include <cstdio> #include <queue>
【BJOI 2006】狼抓兔子(對偶圖)
題目連結 題解 明顯是求給定的圖的最小割。 但是如果直接跑最大流的話會爆炸。 我們發現這個圖有一個性質:它是一個平面圖(可平面圖)。 我們考慮構造它的對偶圖,因為對偶圖的最短路即是
【平面圖轉對偶圖】【最短路】【Beijing 2006】【bzoj 1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 13409 Solved: 3191 Description 現在小朋友們最喜歡的”喜羊羊與灰太狼”,話說
【BZOJ4519】[Cqoi2016]不同的最小割 最小割樹
main href family iostream 有趣的 rip tput ans val 【BZOJ4519】[Cqoi2016]不同的最小割 Description 學過圖論的同學都知道最小割的概念:對於一個圖,某個對圖中結點的劃分將圖中所有結點分成兩個部分,
HDU 5889【最小割+最短路】
ID 要求 當前 置1 優化 AC return pri string 題意:給出一張n個點m條邊的無向圖,邊權均為1,敵人在n點準備走最短路在攻擊己方位置1點,現在要在一些邊上設置一些路障,給出每條邊設置路障的代價,要求用最少的代價設置路障使得敵人必然遇到路障。 這份代碼
BZOJ1001 [BeiJing2006]狼抓兔子 平面圖轉對偶圖,最小割轉最短路
bits ges code inf 如果 對偶圖 += ron oid 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 28885 Solved: 7540[Submit
網路流(最小割最大流(記錄路徑))【POJ1815】
【POJ1815】 出處:原帖 題意:就是求s點到t點,最少去掉幾個點使得他們不連通。如果無解輸出NO ANSWER! 解題思路 因為最小割只能求割掉幾條邊的解,我們要求的是割掉幾個點。那麼我們可以這樣考慮:把每個點拆成入點和出點。入點->出點權值為1。那麼
bzoj1001: [BeiJing2006]狼抓兔子(最大流)
題目傳送門 解法: 每一隻兔子就需要一隻狼。 那麼我們只需要求出最多能通過多少隻兔子即可。 然後就派多少隻狼就行了唄。。 因為兔子從哪裡過來的我就在哪裡放狼。 所以狼的數量一定等於最多兔子通過的數量 題目並不要求求方案,所以不需知道兔子從哪過來。
BZOJ1001 [BeiJing2006]狼抓兔子(網路流最小割)
題目可以轉化為:從原圖中選出一個邊集,使得去掉它之後,(1,1)與(n,m)不通 即:以(1,1)為源,(n,m)為匯,求該圖最小割 不過由於節點過多,直接對輸入的圖求最小割的話會超時 轉化:求
bzoj1001 [BeiJing2006]狼抓兔子(網路流dinic演算法||最短路spfa)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 24017 Solved: 6
bzoj 4541: [Hnoi2016]礦區【平面圖轉對偶圖+生成樹】
ext tdi bool lld printf cer code push main 首先平面圖轉對偶圖,大概思路是每條邊存正反,每個點存出邊按極角排序,然後找每條邊在它到達點的出邊中極角排序的下一個,這樣一定是這條邊所屬最小多邊形的臨邊,然後根據next邊找出所有多邊形,
平面圖轉對偶圖(Bzoj1001:狼抓兔子)
fin con names esp || ons down ace ++ 如果只會用最小割做這道題那就太菜辣 引入 來自某學長 平面圖:在平面上邊不相交的圖(邊可以繞著畫) 那麽平面圖的邊與邊就圍成了許多個區域(這與你畫圖的方式有關) 定義對偶圖:把相鄰的兩個區域連上邊,形
bzoj 1001 [BeiJing2006]狼抓兔子 最小割+最短路
href next jks queue https type getchar read ng2 題面 題目傳送門 解法 將最大流轉化成最小割,然後跑最短路即可 具體如何見圖可以參考下圖 盡量用dijkstra 代碼 #include <bits/stdc++.h&g