完美的牛栏【原创】
題目描述
農夫約翰上個星期剛剛建好了他的新牛棚,他使用了最新的擠奶技術。不幸的是,由于工程問題,每個牛欄都不一樣。第一個星期,農夫約翰隨便地讓奶牛們進入牛欄,但是問題很快地顯露出來:每頭奶牛都只愿意在她們喜歡的那些牛欄中產奶。上個星期,農夫約翰剛剛收集到了奶牛們的愛好的信息(每頭奶牛喜歡在哪些牛欄產奶)。一個牛欄只能容納一頭奶牛,當然,一頭奶牛只能在一個牛欄中產奶。 給出奶牛們的愛好的信息,計算最大分配方案。輸入
第一行 兩個整數,N (0 <= N <= 200) 和 M (0 <= M <= 200) 。N 是農夫約翰的奶牛數量,M 是新牛棚的牛欄數量。 第二行到第N+1行 一共 N 行,每行對應一只奶牛。第一個數字 (Si) 是這頭奶牛愿意在其中產奶的牛欄的數目 (0 <= Si <= M) 。后面的 Si 個數表示這些牛欄的編號。牛欄的編號限定在區間 (1..M) 中,在同一行,一個牛欄不會被列出兩次。輸出
只有一行。輸出一個整數,表示最多能分配到的牛欄的數量。樣例輸入
5 52 2 53 2 3 42 1 53 1 2 51 2樣例輸出
4圖論基礎題,dfs直接過。 code: #include<stdio.h> #include<string.h> int n,m,a,b,jz[402][402],ans,match[402]; int vis[402]; int dfs(int i) {int k,j;for(k=1;k<=jz[i][0];k++){j=jz[i][k];if(!vis[j]){vis[j]=1;if (!match[j]||dfs(match[j])){match[j]=i;return 1;}}}return 0; } int main() {int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&a);for(j=1;j<=a;j++){scanf("%d",&b);jz[i][++jz[i][0]]=b+200;jz[b+200][++jz[b+200][0]]=i;}}for(i=1;i<=n;i++){ans+=dfs(i);memset(vis,0,sizeof vis);}printf("%d",ans);return 0; }
總結
- 上一篇: C++ 关键字auto tcy
- 下一篇: qt QRubberBand实现区域选择