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