二分匹配模板题,找最小路径覆盖集(有最小路径覆盖集=顶点数-最大匹配集),
第一次运用二分匹配解题,不过用了好长的时间吖,主要是指针的错误很难发现~!
借用一个link的指针来建邻接表,结果没注意到这个指针每次要重开一个空间,
晕死啦.....
0ms代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
typedef struct link
{
int id;
link* next;
}link;
int flag[122];
int result[122];
link *head[122];
link *last[122];
bool find(int a)
{
link *t=head[a];
while(t!=NULL)
{
if(!(flag[t->id]))
{
flag[t->id]=1;
if((result[t->id]==0)||(find(result[t->id])))
{
result[t->id]=a;
return true;
}
}
t=t->next;
}
return false;
}
int main()
{
int t,n,m,i,ans,x,y,j;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
{
last[i]=head[i]=NULL;
result[i]=0;
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
link *p=(link *)malloc(sizeof(link));
p->id=y;
p->next=NULL;
if(last[x]==NULL)
{
head[x]=p;
last[x]=head[x];
}
else
{
last[x]->next=p;
last[x]=last[x]->next;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) flag[j]=0;
if(find(i)) {ans++;}
}
printf("%d\n",n-ans);
}
return 0;
}