n個人分成m組,求人數最多的那一組人數的最小值。
每個人肯定只能匹配乙個組,但乙個組可以匹配多個人,因此屬於多重匹配。
我們設定乙個limit,表示每組最多能容納的人數。在dfs(u)尋找u的匹配時,如果某一組vv的人數小於limit,那麼可以把u和vv匹配,vv已經匹配的人數+1。否則,當人數已經達到limit,我們對vv的每個匹配做dfs,即尋找增廣,若能找到,修改這個匹配,即讓vv和u匹配。
然後我們可以二分limit,當u集合(人的集合)中所有點都能找到匹配,則減小limit值,否則只要有乙個點找不到匹配,增大limit值。
多重匹配和二分匹配匈牙利演算法的寫法類似,只不過加了乙個cnt陣列表示v已經匹配到的人數,linker陣列也增加了一維。
1 #include2 #include3 #include4using
namespace
std;
5int
n,m;
6 vector v[1100];7
int linker[1100][1100],vis[1100],cnt[1100];8
intlimit;
9bool dfs(int
u)10
23else
2432}33
}34}35
}36return
false;37
}38intmain()
3958
int num=0;59
bool judge=false;60
for(;j)
6167
else
break;68
}69if(judge) v[i].push_back(num);
70if(jgoto
loop;71}
72int l=0,r=n;
73while(l7482
if(i>=n) r=limit;
83else l=limit+1;84
}85 printf("
%d\n
",l);86}
87return0;
88 }
hdu 1669 二分 多重匹配)
思路 由於要求minimize the size of the largest group,由此我們想到二分列舉,然後每一次求一下多重匹配就可以了。1 include2 include3 include4 include5 include6 using namespace std 7 define ...
二分多重匹配模板
以poj 2289 為例。include include include include include include include using namespace std const int maxn 1010 const int maxm 1010 510 struct edge edge ...
hdu2413 二分 二分匹配
題意 地球和外星球大戰,地球有n個飛船,外星球有m個飛船,每個飛船有自己的其實戰艦和戰艦增長率,星球於星球之間有距離,問你最少多少年地球可以打敗外星球,每個星球最多只能和乙個星球對戰.思路 題意的最後一句話告訴我們這個題目滿足二分圖,我們可以二分列舉多少年打敗,每次都重新建圖,對於h i 和 a j...