1. 程式人生 > >POJ 1466 Girls and Boys

POJ 1466 Girls and Boys

題意:根據給出的資料,可以得出點與點之間的關係,如果兩個不同集合中的點有一條關聯線的話,那就證明他們有關係,否則就沒有關係,題目讓我們求的是從這n個點中,找出m個點,這m個點中兩兩之間沒有關聯關係。求m的最大值 。

最大獨立集點數 = n-最大匹配數。

最大獨立數 = 未匹配的節點+匹配數/2;

未匹配的節點數 = 頂點數 - 匹配數;

得出 : 最大獨立數 = 頂點數 - 匹配數/2;------->   結論推導來源

#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int maxn=1000;
int n,m,res;
int num[maxn],vis[maxn],form[maxn];
int g[maxn][maxn];
bool find(int x)
{
	for(int i=0;i<n;i++)
	{
		int v=g[x][i];
		 if( v && vis[i]==0)
		 {
		 	vis[i]=1;
		 	if(form[i]==-1 || find(form[i]))
		 	{
		 		form[i]=x;
		 		return true;
			 }
		 }
	}
	return false;
}
int Hungary()
{
	memset(form,0xff,sizeof(form));
	  int all=0;
	  for(int i=0;i<n;i++)
	  {
	  	 memset(vis,0,sizeof(vis));
	  	  if(find(i))
	  	  all++;
	  }
	  return all;
}
int main()
{
   while(scanf("%d",&n)!=EOF)
   {
   	 memset(g,0,sizeof(g));
   	 for(int p=0;p<n;p++)
   	 {
   	 	scanf("%d: (%d) ",&m,&res);
   	   for(int i=0;i<res;i++)
   	   {
   	       int k;
   	       scanf("%d",&k);
   	       g[m][k]=1;
	   }  
	 }
	  int ans=Hungary();
	  printf("%d\n",n-ans/2);
   }
   return 0;
}