POJ 3692 Kindergarten(最大团)

题目链接:http://poj.org/problem?id=3692

题意:幼儿园有N(<=200)个小女孩儿,M(<=200)个小男孩儿。女的之间都认识,男的之间都认识。以下P组,每组两个数X和Y,X(女)和Y(男)认识。选出最多的人,互相认识。

思路:最大团=补图的最大独立集=|G|-补图的最大匹配。

#include <iostream>

#include <stdio.h>

using namespace std;





const int MAX=205;

int a[MAX][MAX];

int visit[MAX],link[MAX];

int n,m,p,num=0;







int DFS(int t)

{

	int i;

	for(i=1;i<=m;i++) if(!visit[i]&&a[t][i])

	{

		visit[i]=1;

		if(link[i]==-1||DFS(link[i]))

		{

			link[i]=t;

			return 1;

		}

	}

	return 0;

}







int main()

{

	while(scanf("%d%d%d",&n,&m,&p),n||m||p)

	{

		int i,j,k1,k2;

		for(i=1;i<=n;i++) for(j=1;j<=m;j++) a[i][j]=1;

		

		for(i=1;i<=p;i++)

		{

			scanf("%d%d",&k1,&k2);

			a[k1][k2]=0;

		}

		memset(link,-1,sizeof(link));

		int ans=0;

		for(i=1;i<=n;i++)

		{

			memset(visit,0,sizeof(visit));

			if(DFS(i)) ans++;

		}

		printf("Case %d: %d\n",++num,n+m-ans);

	}

	return 0;

}

  

 

你可能感兴趣的:(poj)