POJ 3692 Kindergarten(最大独立集)

来源:互联网 发布:如何在excel筛选数据 编辑:程序博客网 时间:2024/05/24 07:12

POJ 3692 Kindergarten

题目链接

题意:一个班级内,男的都互相认识,女的都互相认识,现在有k对男女互相认识,要求选出最多的人,使得他们两两互相认识

思路:最大独立集,把不认识的连边,就可以求出最大独立集就是两两互相认识的

代码:

#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int N = 205;int G, B, k, graph[N][N];vector<int> g[N];int left[N], vis[N];bool dfs(int u) {for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (vis[v]) continue;vis[v] = 1;if (!left[v] || dfs(left[v])) {left[v] = u;return true;}}return false;}int hungary() {int ans = 0;memset(left, 0, sizeof(left));for (int i = 1; i <= G; i++) {memset(vis, 0, sizeof(vis));if (dfs(i)) ans++;}return ans;}int main() {int cas = 0;while (~scanf("%d%d%d", &G, &B, &k) && G) {int u, v;memset(graph, 0, sizeof(graph));while (k--) {scanf("%d%d", &u, &v);graph[u][v] = 1;}for (int i = 1; i <= G; i++) {g[i].clear();for (int j = 1; j <= B; j++) {if (graph[i][j]) continue;g[i].push_back(j);}}printf("Case %d: %d\n", ++cas, G + B - hungary());}return 0;}


0 0
原创粉丝点击