_Never_

I walk slowly,but I will never stop.

导航

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;
}

 

posted on 2011-10-28 11:42  _Never_  阅读(473)  评论(0编辑  收藏  举报