Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16888 | Accepted: 7721 |
Description 算法
Input dom
Output ui
Sample Input spa
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
Sample Output .net
4
Source code
二分圖匹配.匈牙利算法. ip
/*============================================================================= # FileName: 1274.cpp # Desc: poj 1274 # Author: zhuting # Email: cnjs.zhuting@gmail.com # HomePage: my.oschina.net/locusxt # Version: 0.0.1 # CreatTime: 2013-12-07 15:54:43 # LastChange: 2013-12-07 15:54:43 # History: =============================================================================*/ #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <algorithm> #define maxn 205 bool mymap[maxn][maxn] = {0};/*記錄是否兩點相連*/ int link[maxn] = {0};/*記錄右邊的點所鏈接的點,沒有時置-1*/ bool cover[maxn] = {0};/*記錄右邊的某個點有沒有被覆蓋,防止死循環*/ int n = 0, m = 0; bool find (int x)/*尋找左邊的點*/ { for (int i = 0; i < m; ++i)/*對右邊的點進行遍歷*/ { if (!cover[i] && mymap[x][i])/*若是該右點沒有被覆蓋,而且與左點x之間有線相連*/ { cover[i] = 1; if (link[i] == -1 || find(link[i])) { link[i] = x; return 1; } } } return 0; } void init() { memset(mymap, 0, sizeof(mymap)); memset(cover, 0, sizeof(cover)); memset(link, 0xff, sizeof(link)); return; } int main() { int link_num = 0; int stall = 0; while (scanf("%d%d", &n, &m) != EOF) { int ans = 0; init(); for (int i = 0; i < n; ++i) { scanf("%d", &link_num); for (int j = 0; j < link_num; ++j) { scanf("%d", &stall); mymap[i][stall - 1] = 1; } } for (int i = 0; i < n; ++i)/*遍歷全部左點*/ { memset(cover, 0, sizeof(cover)); if (find(i)) ++ans; } printf("%d\n", ans); } return 0; }
第一道二分圖,匈牙利算法 ci