二分匹配模板题,找最小路径覆盖集(有最小路径覆盖集=顶点数-最大匹配集),
第一次运用二分匹配解题,不过用了好长的时间吖,主要是指针的错误很难发现~!
借用一个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;
}