1. 程式人生 > >BZOJ 1532 POI 2005 Kos-Dicing 最大流+二分

BZOJ 1532 POI 2005 Kos-Dicing 最大流+二分

題目大意

給出一些比賽,每場比賽有一個人會勝出,問勝出最多次的人最少勝出多少次。

思路

首先二分答案,轉化成判定問題。觀察題目,注意到每場比賽只有一個人勝出,那麼這可以成為網路流建圖流量限制的依據。
具體:
S->每個人 f:二分的最大勝出次數。
每個人->他參與的比賽 f:1
每場比賽->T f:1
每次判斷最大流和比賽是否相等。

CODE

#define _CRT_SECURE_NO_WARNINGS

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> #define MAXP 20010 #define MAXE 1000010 #define S 0 #define T (MAXP - 1) #define INF 0x3f3f3f3f using namespace std; struct MaxFlow{ int head[MAXP], total; int _next[MAXE], aim[MAXE], flow[MAXE]; int deep[MAXP]; void Reset() { total = 1; memset(head, 0
, sizeof(head)); } void Add(int x, int y, int f) { _next[++total] = head[x]; aim[total] = y; flow[total] = f; head[x] = total; } void Insert(int x, int y, int f) { Add(x, y, f); Add(y, x, 0); } bool BFS() { static queue<int
>
q; while(!q.empty()) q.pop(); memset(deep, 0, sizeof(deep)); deep[S] = 1; q.push(S); while(!q.empty()) { int x = q.front(); q.pop(); for(int i = head[x]; i; i = _next[i]) if(flow[i] && !deep[aim[i]]) { deep[aim[i]] = deep[x] + 1; q.push(aim[i]); if(aim[i] == T) return true; } } return false; } int Dinic(int x, int f) { if(x == T) return f; int temp = f; for(int i = head[x]; i; i = _next[i]) if(flow[i] && temp && deep[aim[i]] == deep[x] + 1) { int away = Dinic(aim[i], min(flow[i], temp)); if(!away) deep[aim[i]] = 0; flow[i] -= away; flow[i^1] += away; temp -= away; } return f - temp; } }solver; pair<int, int> match[MAXP]; int points, edges; inline void BuildGraph(int ans) { solver.Reset(); for(int i = 1; i <= points; ++i) solver.Insert(S, i, ans); for(int i = 1; i <= edges; ++i) { solver.Insert(points + i, T, 1); solver.Insert(match[i].first, points + i, 1); solver.Insert(match[i].second, points + i, 1); } } int main() { cin >> points >> edges; for(int i = 1; i <= edges; ++i) scanf("%d%d", &match[i].first, &match[i].second); int l = 1, r = edges, ans = 1; while(l <= r) { int mid = (l + r) >> 1; BuildGraph(mid); int max_flow = 0; while(solver.BFS()) max_flow += solver.Dinic(S, INF); if(max_flow == edges) r = mid - 1, ans = mid; else l = mid + 1; } cout << ans << endl; return 0; }

相關推薦

BZOJ 1532 POI 2005 Kos-Dicing +二分

題目大意 給出一些比賽,每場比賽有一個人會勝出,問勝出最多次的人最少勝出多少次。 思路 首先二分答案,轉化成判定問題。觀察題目,注意到每場比賽只有一個人勝出,那麼這可以成為網路流建圖流量限制的依據。 具體: S->每個人 f:二分的最大勝出次數。

[POI2005]KOS-Dicing+二分)lg3425

 題面https://www.luogu.org/problemnew/show/P3425 題面說贏的最多的人最少贏幾場,肯定是向二分的方向思考 建立源點向每一場比賽連容量為1的邊,從每場比賽向參賽兩個人各連一條容量為1的邊,表示一場比賽有一個人贏 二分一個最多的人贏的場數,從每個人向匯點連

BZOJ 3218 A+B Problem( + 主席樹優化建圖)

分享 bzoj post 感覺 線段樹 不能 line 需要 clas 題目:A+B Problem 感謝 Nietzsche 在省選緊迫之際花 39‘ 給我講這道題。 這題我並沒有想出來,感覺又浪費一道好題了。 需要用最小割,建模方式如下(假設若 2 取黑色,1 取白

BZOJ 2756 SCOI2012 奇怪的遊戲

小結 link bsp std 黑點 配對 int long AD 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜歡上一個奇怪的遊戲。 這個遊戲在一個 N

bzoj 2095 [Poi2010]Bridges 判斷歐拉維護,+二分

OS next math ans 由於 src int sed php [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1448 Solved: 510[Submit][Status

BZOJ 1001 - 狼抓兔子 - [Dinic][BeiJing2006][待補]

題目連結:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:

hdoj 1532 Drainage Ditches 題解(

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7845    Accept

Risk UVA - 12264 拆點法++二分

sizeof main net style ati continue ons class tps /** 題目:Risk UVA - 12264 鏈接:https://vjudge.net/problem/UVA-12264 題意:給n個點的無權無向圖(n<=100

POJ2289 Jamie's Contact Groups —— 二分圖多重匹配/ + 二分

u+ letter appears i++ ive desc target ups tro 題目鏈接:https://vjudge.net/problem/POJ-2289 Jamie‘s Contact Groups Time Limit: 7000MS

POJ2112 Optimal Milking —— 二分圖多重匹配/ + 二分

題目 none utili cnblogs tell pac log head star 題目鏈接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS Memory L

POJ3189 Steady Cow Assignment —— 二分圖多重匹配/ + 二分

next cows int find ebr including top miss -s 題目鏈接:https://vjudge.net/problem/POJ-3189 Steady Cow Assignment Time Limit: 1000MS Me

1305. [CQOI2009]跳舞【+二分

else edge fine string 男女 nbsp CP ios clu Description 一次舞會有n個男孩和n個女孩。每首曲子開始時,所有男孩和女孩恰好配成n對跳交誼舞。每個男孩都不會和同一個女孩跳兩首(或更多)舞曲。有一些男孩女孩相互喜歡,而其他相互不

POJ-2112 Optimal Milking(floyd++二分)

存在 AC d+ display i++ IV for 對角線 while 題目大意: 有k個擠奶器,在牧場裏有c頭奶牛,每個擠奶器可以滿足m個奶牛,奶牛和擠奶器都可以看成是實體,現在給出兩個實體之間的距離,如果沒有路徑相連,則為0,現在問你在所有方案裏面,這c頭奶牛需要走

HDU 3277 Marriage Match III + 二分 + 並查集 + 拆點建圖

                                     Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe

Codeforces 513F2 題解 (網路- 二分 BFS)

Scaygerboss 題目描述 在一個有障礙的網格圖中,有male 個男人和female 個女人,還有一個叫BOSS的人妖(既可以當男人又可以當女人)。這些人分佈在地圖上,每一個cell可以同時有多個人。這些人每個人移動各需要ti 的時間,問最小

3189 Steady Cow Assignment 二分 + 列舉 + (||二分圖多重匹配)

題意:有n頭豬,m個豬圈,每個豬圈都有一定的容量,每隻豬對每個豬圈的喜好度不同(所有豬圈在每個豬心中都有一個排名),要求所有的豬都進豬圈,但是要求所有豬的喜好度排名最低的和最高的差值的絕對值最小。 思路:這題網上很多做法,但綜合來說無非  二分、列舉、最大流、二分圖多重匹

POJ2195 Going Home (小費||二分大權匹配)

Going Home Description On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontal

Poj 2112 [] [二分圖的多重匹配]

      此題涉及的知識點比較多:最短路徑,二分查詢,二分圖的多重匹配,最大流問題。 該題有3中解法:(都必須先二分答案,然後再用一下的方法)      1. 重新建圖,把多重匹配的點分裂成多個點來解二分圖的最大匹配      2. 直接解多重匹配(修改二分圖的最大匹配演

poj 2455 +二分

一開始以為用矩陣 d[i][j] 可以節省時間和效率的呢,不過後來考慮到那樣可能會把邊搞的少了許多!!導致WA了n次。。。。 /* 題目描述: 題意:FJ有N塊地,這些地之間有P條雙向路,每條路的都有固定的長度l。 現在要你找出從第1塊地到第n塊地的T條不同路徑, 每條路

poj 2112 (+二分)

題意:有k臺擠奶機,c頭奶牛,給出這k+c個實體間的距離,求出每頭奶牛都到一臺擠奶機去,怎麼分配使奶牛走的最大距離最小。 用二分列舉最大距離,,,, #include<stdio.h> #include<string.h> #define