bzoj1001 [BeiJing2006]狼抓兔子(網路流dinic演算法||最短路spfa)
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 24017 Solved: 6068
[Submit][Status][Discuss]
Description
現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:左上角點為(1,1),右下角點為(N,M)(上圖中N=4,M=5).有以下三種類型的道路 1:(x,y)<==>(x+1,y)
Input
第一行為N,M.表示網格的大小,N,M均小於等於1000.Output
輸出一個整數,表示參與伏擊的狼的最小數量.
Sample Input
3 45 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
14HINT
2015.4.16新加資料一組,可能會卡掉從前可以過的程式。
【解析】:解法1:網路流dinic演算法,但需要很多地方優化才能不超時,比如
1.dfs過程中,如果某一步,從某點遞迴返回的最大流沒有正數值,則增廣路已經找完,直接把標號d[s]=-1,就能終止遞迴。
2.bfs標號過程中,只要遇到匯點,就立即return,不做後面的無用功
解法2:把每個環路圍成的區域看做一個點,建好圖,從右上角往左下角跑一邊最短路,就能把圖切開。
【程式碼1】:(dinic)
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #define mset(a,i) memset(a,i,sizeof(a))
- #define S1(n) scanf("%d",&n)
- #define S2(n,m) scanf("%d%d",&n,&m)
- #define P(n) printf("%d\n",n)
- usingnamespace std;
- typedeflonglong ll;
- constint INF=0x3f3f3f3f;
- constint MAX=1e6+5;
- int n,m;
- struct node{
- int u,v,w,next;
- }edge[6*MAX];
- int head[MAX];
- int d[MAX];//給點標號
- void add(int u,int v,int w) //鏈式前向星建圖
- {
- staticint cnt=0;
- edge[cnt].v=v;
- edge[cnt].w=w;
- edge[cnt].next=head[u];
- head[u]=cnt++;
- }
- int bfs(int s,int t)
- {
- mset(d,0);
- d[s]=1;
- queue <int> q;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- if(u==t) return 1; //到達匯點
- for(int i=head[u];i!=-1;i=edge[i].next) //搜增廣路
- {
- int v=edge[i].v; //下一可連通點
- int w=edge[i].w; //當前流量
- if(w&&d[v]==0) //temp1沒走到
- {
- d[v]=d[u]+1; //點加1
- if(v==t) //找到增廣路
- return 1;
- q.push(v); //入佇列
- }
- }
- }
- return 0;
- }
- int dfs(int s,int t,int maxflow=INF)
- {
- if(s==t)
- return maxflow;
- int i,j,ret=0;
- for(i=head[s];i!=-1;i=edge[i].next)
- {
- int v=edge[i].v; //下一個可連通點
- int w=edge[i].w; //當前點的流量
- if(w&&d[v]==d[s]+1)
- {
- int temp=dfs(v,t,min(maxflow-ret,w)); //下一點,取最大流跟當前流量小的一個
- edge[i].w-=temp; //正向相減
- edge[i^1].w+=temp; //反向弧相加
- ret+=temp; //最大流
- if(ret==maxflow) //下一點最大流等於這一點
- return ret;
- }
- }
- if(!ret)
- d[s]=-1;
- return ret;
- }
- int dinic(int s,int t)
- {
- int ans=0;
- while(bfs(s,t))
- {
- ans+=dfs(s,t); //dfs返回每次的數量
- }
- return ans;
- }
- int main()
- {
- S2(n,m);
- mset(head,-1);
-
相關推薦
bzoj1001 [BeiJing2006]狼抓兔子(網路流dinic演算法||最短路spfa)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 24017 Solved: 6
BZOJ1001 [BeiJing2006]狼抓兔子(網路流最小割)
題目可以轉化為:從原圖中選出一個邊集,使得去掉它之後,(1,1)與(n,m)不通 即:以(1,1)為源,(n,m)為匯,求該圖最小割 不過由於節點過多,直接對輸入的圖求最小割的話會超時 轉化:求
[BZOJ1001][BeiJing2006]狼抓兔子 && 平面網路流
傳說這個題可以轉最短路 於是我去轉最短路 於是搞的我無比糾結 連邊麻煩的要死 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream>
bzoj1001: [BeiJing2006]狼抓兔子(最大流)
題目傳送門 解法: 每一隻兔子就需要一隻狼。 那麼我們只需要求出最多能通過多少隻兔子即可。 然後就派多少隻狼就行了唄。。 因為兔子從哪裡過來的我就在哪裡放狼。 所以狼的數量一定等於最多兔子通過的數量 題目並不要求求方案,所以不需知道兔子從哪過來。
BZOJ1001 [BeiJing2006]狼抓兔子 平面圖轉對偶圖,最小割轉最短路
bits ges code inf 如果 對偶圖 += ron oid 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 28885 Solved: 7540[Submit
BZOJ1001[BeiJing2006]狼抓兔子最小割網路流
Description 現在小朋友們最喜歡的”喜羊羊與灰太狼”,話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形: 左上角點為(1,1),右下角點為(N,M)(上圖中N=
bzoj1001 [BeiJing2006]狼抓兔子
script 輸入 wid 最小數 memset dinic nbsp 所有 des 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 12749 Solved: 3
BZOJ1001: [BeiJing2006]狼抓兔子
div tar name family 設有 amp 兔子 ast mil 【傳送門:BZOJ1001】 簡要題意: 有一個n*m大小的矩陣,假設有一個點(x,y),那麽這個點與(x+1,y)、(x,y+1)、(x+1,y+1)三條邊都連有一條有流量單向邊,且
BZOJ1001: [BeiJing2006]狼抓兔子 (最小割轉最短路)
pty closed bsp ini 分割 pan void define 最短 淺析最大最小定理在信息學競賽中的應用---周東 ↑方法介紹 對於一個聯通的平面圖G(滿足歐拉公式) 在s和t間新連一條邊e; 然後建立一個原圖的對偶圖G*,G*中每一個點對應原圖中每一個面,每
【BZOJ1001】狼抓兔子(平面圖轉對偶圖,最短路,最小割)
題面 BZOJ 洛谷 題解 這題用最小割可以直接做 今天再學習了一下平面圖轉對偶圖的做法 大致的思路如下: 1.將源點到匯點中再補一條不與任何線段有交點的邊。這條邊把外側無限大的區域劃
最小割——BZOJ1001 [BeiJing2006]狼抓兔子
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 啊我還能說什麼。。。 dinic網路流直接過了 只要對於每個節點重新編號即可,大眾速度吧。
BZOJ1001 [Beijing2006] 狼抓兔子
相關資料: 根據最大流-最小割定理,一個網路中,兩個邊緣點之間的最大流等於最小割(最小割就是用一條割線將兩個點分割在兩個圖中,令刪去的邊的總權值最小。因此我們可以建圖,將每個圖(在本題中是每個三角形)作為一個點,點與點之間的連線就等於它們穿過的那條線的權值。在起點和終點間
【網路流24題之一】飛行員配對問題+求方案(網路流dinic演算法求二分圖最大匹配)
題面 題目背景 第二次世界大戰時期.. 題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可
1001: [BeiJing2006]狼抓兔子[dinic網路流]
現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形: 左上角點為(1,1),右下角點為(N,M)(上圖中N=4,M=5).有以下三種類型的道路 1:(x,y)<
BZOJ1001:狼抓兔子(最小割最大流+vector模板)
cout 地形 ++ 能夠 can 圖片 jpg http img 1001: [BeiJing2006]狼抓兔子 Description 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在
【BZOJ1001】【Beijing2006】狼抓兔子(平面圖轉對偶圖:最小割+最短路)
題目描述 傳送門 題解 題目描述很明顯這就是一道最小割,不過跑最大流的話會TLE。 我們發現這是一個平面圖(什麼是平面圖?),那麼我們就可以參考平面圖轉對偶圖的思想,將這道題轉化成最短路。
1001: [BeiJing2006]狼抓兔子 (最大流)
地形 opened har 分享 false led www getch data Description 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個
BZOJ 1001 狼抓兔子(網絡流)
end init false bzoj algo syn i++ vector std 題解:這個建圖很簡單,只要把(1,1)這個點作為超級源,(n,m)作為超級源就可以xjbp。空間要算好。dinic當前弧優化一下就可以跑1500ms #include <io
[BJOI2006]狼抓兔子(網絡流)
地形 道路 urn pri cout 第三部分 第二部分 void struct 題目描述 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的
【BZOJ1001】【BJOI2006】狼抓兔子(對偶圖,最短路)
Description 現在小朋友們最喜歡的”喜羊羊與灰太狼”,話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形: