poj3692 补图二分图,最大团

来源:互联网 发布:淘宝教育平台 编辑:程序博客网 时间:2024/04/28 23:17

我们求一个图的最大团 = 求补图的最大独立集


而我们这道题很特殊!! 它男女边所有点都是连接的,他的补图就是都不连接,也就是二分图!!!

我们也就是求二分图的最大独立集。

最大独立集点数 = N - 最大匹配数。


所以我们直接建立补图,匈牙利算法求最大匹配。一减就行了

  1. #include<iostream>  
  2. #include<stdio.h>  
  3. #include<string.h>  
  4. using namespace std;  
  5. #define maxm 405  
  6. int n,m,s;  
  7. int map[maxm][maxm],vis[maxm],link[maxm];//map存图  
  8. int dfs(int t)  
  9. {  
  10.     for(int i=1;i<=m;i++)  
  11.     {  
  12.         if(vis[i]==0&&map[t][i])  
  13.         {  
  14.             vis[i]=1;  
  15.             if(link[i]==-1||dfs(link[i]))  
  16.             {  
  17.                 link[i]=t;  
  18.                 return 1;  
  19.             }  
  20.         }  
  21.     }  
  22.     return 0;  
  23. }  
  24. int MaxMatch()  
  25. {  
  26.     int num=0;  
  27.     memset(link,-1,sizeof(link));  
  28.     for(int i=1;i<=n;i++)  
  29.     {  
  30.         memset(vis,0,sizeof(vis));  
  31.         if(dfs(i))  
  32.         num++;  
  33.     }  
  34.     return num;  
  35. }  
  36. int main()  
  37. {  
  38.     int a,b,cas=1;  
  39.     while(cin>>n>>m>>s)  
  40.     {  
  41.         if(n==0&&m==0&&s==0)break;  
  42.         for(int i=1;i<=n;i++)  
  43.         for(int j=1;j<=m;j++)  
  44.         map[i][j]=1;  
  45.         for(int i=0; i<s; i++)  
  46.         {  
  47.             cin>>a>>b;  
  48.             map[a][b]=0;  
  49.         }  
  50.         cout<<"Case "<<cas++<<": "<<n+m-MaxMatch()<<endl;  
  51.     }  
  52.     return 0;  
  53. }