POJ 1466 Girls and Boys
。。。。。。。。。。。
啥也不想说,我只想骂出题人!!!
能不能人性点!!!R尼玛,出题数据,那是随便随机的??你知道你浪费了多少人的时间??
你知道你折磨了多少人的心神??
经过被百般蹂躏,我知道了它的后台数据的某些一定是不对照的,比如2跟1有关系,1跟2关系并不一定给你写出了
你题目很清楚的告诉读者:跟个人的有关系的人数!!你如果说1跟2搞,而2却不一定跟1搞,那总人数-匹配数/2也不对!
尼玛的怎么让AC!!很明显必须是相互的!!
尼玛你这样搞是会折寿的……
算了,说点正事……
这个是:求最大独立集
最大独立集==N-最大匹配数(即最大覆盖点数)
理解:除去有关系了,都是没关系的
这个相对好理解一点,那俩关系哥都理解!
这俩天做的题都是:求最大匹配数的(即find())算法!
暑假美学二分图,这算是补上了!
View Code
#include <stdio.h>
#include <string.h>
#define N 500
#define M 125000
int nodev[N];
int nodeu[M],next[M];
/*
int getNumfromStr(char *s)
{
int i=0,num=0;
while(s[i]<'0'||s[i]>'9') i++;
do
{
num=num*10+s[i]-'0';
i++;
}while(s[i]>='0'&&s[i]<='9');
return num;
}
*/
void Build_Graph(int n)
{
int i,v,u,ind,num;
// char s[10];
memset(nodev,-1,sizeof(nodev)); ind=0;
for(v=0;v<n;v++)
{
// scanf("%s",s); scanf("%s",s); num=getNumfromStr(s);
scanf("%d: (%d)",&num,&num);
for(i=0;i<num;i++)
{
scanf("%d",&u);
// if(u>v)
{
nodeu[ind]=u;
next[ind]=nodev[v];
nodev[v]=ind;
ind++;
}
}
}
}
int pre[N];
bool no[N];
bool find(int v)
{
int i,u;
for(i=nodev[v];i!=-1;i=next[i])
{
u=nodeu[i];
if(!no[u])
{
if(pre[u]==-1 || (no[u]=true,find(pre[u])))
{
pre[u]=v;
return true;
}
}
}
return false;
}
int solve(int n)
{
int v,cnt=0;
memset(pre,-1,sizeof(pre));
for(v=0;v<n;v++)
{
memset(no,false,sizeof(no));
if(find(v)) cnt++;
}
// return n-cnt;
return n-cnt/2;
}
int main()
{
int n;
// freopen("input.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
Build_Graph(n);
printf("%d\n",solve(n));
}
return 0;
}