求二分图的最大独立集数
最大独立集数D = 顶点数V - 最小点覆盖数C
最小点覆盖数C = 最大匹配数M
orz 竟然跑了3.485S、、
#include <iostream>
using namespace std;
const int N = 510;
int link[N];
bool map[N][N],used[N];
int n;
bool DFS(int t)
{
for(int i=0; i<n; i++)
if(!used[i] && map[t][i])
{
used[i] = true;
if(link[i]==-1 || DFS(link[i]))
{
link[i] = t;
return true;
}
}
return false;
}
int main()
{
int i,count,m,j;
while(scanf("%d", &n)!=EOF)
{
memset(link, -1, sizeof(link));
memset(map, false, sizeof(map));
for(i=0; i<n; i++)
{
scanf("%d: (%d)", &i, &count);
while(count--)
{
scanf("%d", &j);
map[i][j] = true;
}
}
for(i=0,m=0; i<n; i++)
{
memset(used, false, sizeof(used));
if(DFS(i)) m++;
}
printf("%d\n",n-m/2);
}
return 0;
}