1. 程式人生 > >【BZOJ1001】【Beijing2006】狼抓兔子(平面圖轉對偶圖:最小割+最短路)

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

相關推薦

BZOJ1001Beijing2006兔子平面圖對偶+短路

題目描述 傳送門 題解 題目描述很明顯這就是一道最小割,不過跑最大流的話會TLE。 我們發現這是一個平面圖(什麼是平面圖?),那麼我們就可以參考平面圖轉對偶圖的思想,將這道題轉化成最短路。

BZOJ1001兔子平面圖對偶短路

題面 BZOJ 洛谷 題解 這題用最小割可以直接做 今天再學習了一下平面圖轉對偶圖的做法 大致的思路如下: 1.將源點到匯點中再補一條不與任何線段有交點的邊。這條邊把外側無限大的區域劃

洛谷P4001 [BJOI2006]兔子平面圖對偶

bool .html next fine pri n) www moto tdi 傳送門 明明只要最小割加點優化就能過的東西…… 然而我偏偏要去學平面圖轉對偶圖結果發現課件關鍵地方看不清->這裏 而且建圖累的半死…

BZOJ2007: [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),右下角點為(

BZOJ1001BJOI2006兔子對偶短路

Description 現在小朋友們最喜歡的”喜羊羊與灰太狼”,話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:

BZOJ 1001兔子大流

ron define max \n 效率 cpp cstring inf tchar 題目鏈接 最大流裸題,沒什麽好說吧,恰好點數多,考驗網絡流的效率,正好練\(Dinic\)。 #include <cstdio> #include <queue>

BJOI 2006兔子對偶

題目連結 題解 明顯是求給定的圖的最小割。 但是如果直接跑最大流的話會爆炸。 我們發現這個圖有一個性質:它是一個平面圖(可平面圖)。 我們考慮構造它的對偶圖,因為對偶圖的最短路即是

平面圖對偶短路Beijing 2006bzoj 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