bzoj1191 HNOI2006 超级英雄
题意:现在有 n 个锦囊,m 个问题;每个问题可以被 2 个锦囊解答,且每个锦囊这能回答一道问题;求最多能答对几个问题。
题解:模型 -> 二分图的最大匹配;核心算法 -> 匈牙利算法(模版题)。
CODE:
/* Author: JDD PROG: bzoj1191 超级英雄 DATE: 2015.9.24 */ #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 1005 using namespace std; int n, m; int link[MAX_N][MAX_N], G[MAX_N]; bool used[MAX_N]; void init() { scanf("%d%d", &n, &m); memset(link, 0, sizeof(link)); memset(G, 0, sizeof(G)); REP(i, 1, m){ int x, y; scanf("%d%d", &x, &y), x ++, y ++; link[i][x] = 1; link[i][y] = 1; } } bool find(int x) { REP(j, 1, n){ if (link[x][j] == true && used[j] == false){ used[j]=1; if (G[j] == 0 || find(G[j])){ G[j] = x; return true; } } } return false; } void doit() { int ans = 0; REP(i, 1, m){ memset(used, 0, sizeof(used)); if(find(i)) ans ++; else break; } printf("%d\n", ans); } int main() { init(); doit(); return 0; }