题目:在二分图中找出最大的完全二分图
定理:二分图的最大团=其补图的最大独立集
/************************************************ Author :DarkTong Created Time :2016/7/31 15:17:40 File Name :Poj_3296.cpp *************************************************/ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #define INF 0x3f3f3f3f #define esp 1e-9 typedef long long LL; using namespace std; const int maxn = 200 + 10; int w[maxn][maxn], Left[maxn], n, m; bool used[maxn]; bool match(int j) { for(int i=1;i<=n;++i) if(w[i][j]&&!used[i]) { used[i]=true; if(!Left[i]||match(Left[i])) { Left[i]=j; return true; } } return false; } int hungary() { int res=0; memset(Left, 0, sizeof(Left)); for(int i=1;i<=m;++i) { memset(used, 0, sizeof(used)); if(match(i)) res++; } return res; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int k, cas=1; while(scanf("%d%d%d", &n, &m, &k)==3&&(n+m+k)) { int u, v; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { if(i==j) w[i][j]=0; else w[i][j]=1; } for(int i=1;i<=k;++i) { scanf("%d%d", &u, &v); w[u][v]=0; } int ans = hungary(); ans = n+m-ans; printf("Case %d: %d\n", cas++, ans); } return 0; }
时间: 2024-10-25 18:12:50