UESTC 1144 Big Brother
Description
現(xiàn)在有$n$個(gè)囚籠,需要關(guān)押$m$個(gè)犯人,the big brother很擔(dān)心囚籠的安全性,因?yàn)榉溉硕加凶约旱南敕?#xff0c;他們只想住在特定的囚籠里面,那么big brother想知道最多 能關(guān)押多少個(gè)犯人,每個(gè)囚籠只能關(guān)押一個(gè)犯人,一個(gè)犯人也只能關(guān)押在一個(gè)囚籠里面。
Input
第一行 兩個(gè)整數(shù),$N (0 \leq N \leq 200)$ 和 $M (0 \leq M \leq 200)$ 。$N$ 是犯人的數(shù)量,$M$ 是囚籠的數(shù)量。
第二行到第$N+1$行 一共 $N$ 行,每行對(duì)應(yīng)一只犯人。第一個(gè)數(shù)字 $(Si)$ 是這哥犯人愿意待的囚籠的數(shù)量 $(0 \leq Si \leq M)$。后面的$Si$個(gè)數(shù)表示這些囚籠的編號(hào)。
囚籠的編號(hào)限定在區(qū)間 $(1..M)$ 中,在同一行,一個(gè)囚籠不會(huì)被列出兩次。
Output
只有一行。輸出一個(gè)整數(shù),表示最多能分配到的囚籠的數(shù)量.
Sample Input
5 5?
1 1?
1 2?
1 3?
1 4?
1 5
Sample Output
5
二分圖最大匹配模板
code:
#include <iostream> #include <cstring> #include <algorithm> #define size 400 bool vis[size]; int x[size], y[size], Pair[size][size], nx, ny; int path(int u) {for(int v=0;v<ny;v++){if(Pair[u][v] && !vis[v]){vis[v]=true;if(y[v]==-1 || path(y[v])){y[v]=u;x[u]=v;return 1;}}}return 0; } void maxMatch() {int ans=0;memset(x, -1, sizeof(x));memset(y, -1, sizeof(y));for(int i=0;i<=nx;i++){if(x[i]==-1){memset(vis, false, sizeof(vis));ans+=path(i);}}printf("%d\n", ans); } using namespace std; int main() { #ifdef OFFLINEfreopen("yi.txt", "r", stdin); #endifint s, c, i;while(~scanf("%d %d", &nx, &ny)){memset(Pair, 0, sizeof(Pair));memset(vis, false, sizeof(vis));for(i=0;i<nx;i++){scanf("%d",&s);while(s--){scanf("%d",&c);Pair[i][c-1]=1;}}maxMatch();}return 0; }總結(jié)
以上是生活随笔為你收集整理的UESTC 1144 Big Brother的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaWeb01_HTML+CSS实现
- 下一篇: Python 预测孩子身高