您的位置:首页 > 其它

POJ 1466 Grils And Boys

2010-11-04 19:53 330 查看
给m个点,和若干条边,要求选出一个最大的点集,使得任意两点间无边,其实就是求二部图的最大独立集

不过这道题没有明显给出二分图的两部分,于是可以每一边都包含所有顶点,这样求出来的最大匹配就是二部图的两倍

对于二部图,最大独立集=顶点数-最大匹配数

代码:

#include<iostream>
using namespace std;
struct edge
{
int v;
struct edge *next;
}*adj[505],mempool[5000];
int u[505],link[505];
int n,k;
int dfs(int t)
{
int i,cv;
struct edge *ptr;
for(ptr=adj[t];ptr;ptr=ptr->next)
{
cv=ptr->v;
if(!u[cv])
{
u[cv]=1;
if(link[cv]==-1||dfs(link[cv]))
{
link[cv]=t;
return 1;
}
}
}
return 0;
}
int hungary()
{
int i,num=0;
memset(link,-1,sizeof(link));
for(i=1;i<=n;i++)
{
memset(u,0,sizeof(u));
if(dfs(i))
num++;
}
return num;
}
int main()
{
int i,j,c,a,maxMatch;
char x[10],num[20];
while(scanf("%d",&n)!=EOF)
{
k=0;
for(i=1;i<=n;i++)
{
adj[i]=NULL;
scanf("%s",&x);
getchar();
getchar();
scanf("%d",&c);
getchar();
for(j=1;j<=c;j++)
{
scanf("%d",&a);
a++;
struct edge *ptr=&mempool[k++];
ptr->v=a;
ptr->next=adj[i];
adj[i]=ptr;
struct edge *ptr1=&mempool[k++];
ptr1->v=i;
ptr1->next=adj[a];
adj[a]=ptr1;
}
}
maxMatch=hungary();
printf("%d/n",n-maxMatch/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: