http://poj.org/problem?id=1466
在此贴上原题地址,POJ一道转自2000年欧盟题的老古董了。
题目原文是英文的,作为一个英语苦手我大致明白了它的意思:
”给定一群学生,其中某些男女学生之间可以在一起,计算一种配对方案,使单身狗个数最多。“(这题一定是教导主任出的吧!)
乍一看这似乎是一道并查集,通过”男“”女“的界定要想到冷门一些的二分图也不是很难。
到目前为止,这就是一道求最大独立树的纯水题。But
┄┅┄┅┄┅┄┅┄*
看看测试数据吧
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1题目既然是 Girls and Boys(不得不想起一个叫做Boys Like Girls的娘炮乐队),那么是大约可以否认基佬和百合的存在了♂,也就是说在正常人的思维内,一个保证不出现环的图已经成型了,手打匈牙利算法准备自信秒杀。
Source Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int p,n,date[700][700],state[700],result[700];
bool find(int a)
{
int i;
for(i=0;i<p;i++)
{
if(date[a][i]==1&&!state[i])
{
state[i]=true;
if(result[i]==0||find(result[i]))
{
result[i]=a;
result[a]=i;
return true;
}
}
}
return false;
}
int diablos=1;
int main()
{
while(scanf("%d",&p)!=EOF)
{
int i,j,k,o,ans=0;
memset(result,0,sizeof(result));
memset(date,0,sizeof(date));
for(i=0;i<p;i++)
{
scanf("%d: (%d)",&n,&k);
for(j=1;j<=k;j++)
{
scanf("%d",&o);
date[i][o]=1;
date[o][i]=1
}
}
for(i=1;i<=p;i++)
{
memset(state,0,sizeof(state));
if(find(i))
ans++;
}
printf("%d\n",p-ans);
}
}
自信满满提交 and 如图
改了一个晚上始终都是WA,暴怒的我终于无法容忍过不了这样一道水题,果断出绝招
”XXX快点过来帮我看一下一道题!“
”我这会没空,我把我的程序发给你看一下嘛“
于是楼主认真地研究了大神的代码,一段时间之后
我第六次肯定除了变量名之外我绝对没有和大神不一样的地方!
实在无可奈何决定去请教老师,可是遗憾的是老师也没有标程,陪我一起盯着那道题看。
这时正在听歌的某大神忽然一声高呼:
”你快点回来,我把我写错的那个程序发给你了!“
顿时我吐血三升倒地而亡........
在大神的指导下我修改了两个细节成功AC
Source Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int p,n,date[700][700],state[700],result[700],mark;
bool find(int a)
{
int i;
state[a]=true;
for(i=0;i<p;i++)
{
if(date[a][i]==1&&!state[i])
{
state[i]=true;
if(result[i]==-1||find(result[i]))
{
result[i]=a;
return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d",&p)!=EOF)
{
int i,j,k,o,ans=0;
memset(result,-1,sizeof(result));
memset(date,0,sizeof(date));
for(i=0;i<p;i++)
{
scanf("%d: (%d)",&n,&k);
for(j=0;j<k;j++)
{
scanf("%d",&o);
date[i][o]=1;
}
}
for(i=0;i<p;i++)
{
memset(state,false,sizeof(state));
if(find(i))
ans++;
}
printf("%d\n",p-ans/2);
}
}
细心的宝宝有没有发现呢(づ。◕‿‿◕。)づ
这道题所构建的的边应该都是单向边!!!所以在find时的匹配操作就应该只改变一个点的指向值。
可是机智如我为什么会产生这是一个无向图的误会呢?
倒回去看题目自带样例!!!
所有前面出现过的”好感“(姑且可以这么讲嘛)都在后面有过回应。
所以天真如我就毫不犹豫的认为只要喜欢一个人就是可以在一起的~(大雾~)
但是样例如此,事实并非如此!
很可能你朝思暮想的人根本鸟都不想鸟你!
童话里都是骗人的233333......
可是单向变的话,为啥某点单向匹配了一个点之后,会导致某点自己无法再去匹配别人呢?
机智如我立刻想通了关窍!
“你的心已经交给TA了怎么可能还交给别人啊!”
所以最后的结果是,屌丝单相思着他的女神,可是也没可能和女神在一起,也不会想去和别的女生在一起,
于是教导主任罪恶的目的就这样愉快地达到了!♂♂♂