我们求一个图的最大团 = 求补图的最大独立集
而我们这道题很特殊!! 它男女边所有点都是连接的,他的补图就是都不连接,也就是二分图!!!
我们也就是求二分图的最大独立集。
最大独立集点数 = N - 最大匹配数。
所以我们直接建立补图,匈牙利算法求最大匹配。一减就行了
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- #define maxm 405
- int n,m,s;
- int map[maxm][maxm],vis[maxm],link[maxm];//map存图
- int dfs(int t)
- {
- for(int i=1;i<=m;i++)
- {
- if(vis[i]==0&&map[t][i])
- {
- vis[i]=1;
- if(link[i]==-1||dfs(link[i]))
- {
- link[i]=t;
- return 1;
- }
- }
- }
- return 0;
- }
- int MaxMatch()
- {
- int num=0;
- memset(link,-1,sizeof(link));
- for(int i=1;i<=n;i++)
- {
- memset(vis,0,sizeof(vis));
- if(dfs(i))
- num++;
- }
- return num;
- }
- int main()
- {
- int a,b,cas=1;
- while(cin>>n>>m>>s)
- {
- if(n==0&&m==0&&s==0)break;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- map[i][j]=1;
- for(int i=0; i<s; i++)
- {
- cin>>a>>b;
- map[a][b]=0;
- }
- cout<<"Case "<<cas++<<": "<<n+m-MaxMatch()<<endl;
- }
- return 0;
- }