POJ 1274 The Perfect Stall

一个很明显的最大二分匹配!

尽管很明显,但我还是想了一会儿……

为什么?因为我有点忘了它的实现,又想了一会儿,代码敲出来,测试样例数据时,出不来结果~

调试说是栈溢出。。。我又分析了代码。。。确实有问题!缺少标记!!!

最终又加了个no[N]数组,提交才AC!

View Code
#include <stdio.h>
#include <string.h>

#define M 40002
#define N 202

int nodev[N];
int nodeu[M],next[M];
int pre[N];
bool no[N];

void Build_Graph(int n,int m)
{
int v,u,num,ind;
memset(nodev,-1,sizeof(nodev)); ind=0;

for(v=1;v<=n;v++)
{
scanf("%d",&num);
while(num--)
{
scanf("%d",&u);

nodeu[ind]=u;
next[ind]=nodev[v];
nodev[v]=ind;
ind++;
}
}
}

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 main()
{
int v,n,m,cnt;
//freopen("what.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
Build_Graph(n,m);

memset(pre,-1,sizeof(pre)); cnt=0;
for(v=1;v<=n;v++)
{
memset(no,false,sizeof(no));
if(find(v)) cnt++;
}

printf("%d\n",cnt);
}
return 0;
}

 

体会:该算法的思想是尽最大力量为每一个点查找匹配项,不放弃任何一个可能,全部的可能都试试,最终得出结果!

你可能感兴趣的:(poj)