描述
農夫約翰上個星期剛剛建好了他的新牛棚,他使用了最新的擠奶技術。不幸的是,由於工程問題,每個牛欄都不一樣。第乙個星期,農夫約翰隨便地讓奶牛們進入牛欄,但是問題很快地顯露出來:每頭奶牛都只願意在她們喜歡的那些牛欄中產奶。上個星期,農夫約翰剛剛收集到了奶牛們的愛好的資訊(每頭奶牛喜歡在哪些牛欄產奶)。乙個牛欄只能容納一頭奶牛,當然,一頭奶牛只能在乙個牛欄中產奶。
給出奶牛們的愛好的資訊,計算最大分配方案。
輸入格式
第一行 兩個整數,n (0 <= n <= 200) 和 m (0 <= m <= 200) 。n 是農夫約翰的奶牛數量,m 是新牛棚的牛欄數量。
第二行到第n+1行 一共 n 行,每行對應乙隻奶牛。第乙個數字 (si) 是這頭奶牛願意在其中產奶的牛欄的數目 (0 <= si <= m) 。後面的 si 個數表示這些牛欄的編號。牛欄的編號限定在區間 (1..m) 中,在同一行,乙個牛欄不會被列出兩次。
輸出格式
只有一行。輸出乙個整數,表示最多能分配到的牛欄的數量。
sample input
5 52 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2
sample output
4
這是一道匈牙利演算法的入門題,比較簡單不多說。
accode:
#include #include #include #include const char fi = "stall4.in";
const char fo = "stall4.out";
const int maxn = 210;
const int max = 0x3fffff00;
const int min = -max;
struct edge ;
edge *edge[maxn];
int link[maxn];
std::bitset marked;
int n, m, t, c, ans;
void init_file()
inline void insert(int u, int v)
void readdata()
}} bool find(int u)
}return false;
} void work()
printf("%d", ans);
}int main()
二分 二分匹配
給了乙個矩陣 n行m列 選n個數 要保證這n個數不在同行同列,計算出第k大的數最小 二分答案,然後我們對於每個a i j mid的我們就i和j建立一條邊 然後二分求最大匹配必須大於等於n k 1 因為是第k大 而不是第k小 坑了好久才發現 include include include includ...
二分匹配 最大匹配 人員分配 鏈結矩陣
設有m個工人x1,x2,xm,和n項工作y1,y2,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。第一行兩個整數m,n分別為工人數和工作數。接下來乙個...
進擊的奶牛(二分查詢)
farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些牛安置...