月老的難題&&二分圖最大匹配模板&&http://acm.nyist.net/JudgeOnline/problem.php?pid=239

java_beginer1發表於2012-09-29

二分圖最大匹配:用鄰接矩陣超時,需要用鄰接表;

#include<cstdio>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
using namespace std;
const int N=512;
bool chk[N];
vector<int>vis[N];
int n;
int xM[N],yM[N];
bool SearchPath(int u)
{
	int dd=vis[u].size(),yy;
     for(int v=0;v<dd;v++)
	 {yy=vis[u][v];
	   if(!chk[yy])
	   {
	    chk[yy] = true;
		if(yM[yy] == -1 || SearchPath(yM[yy]))
		{
		  yM[yy]=u;
		  xM[u]=yy;
		  return true;
		}
	   }
	 }
	 return false;
}
int MaxMatch()
{
 int ret=0;
 memset(xM,-1,sizeof(xM));
 memset(yM,-1,sizeof(yM));
 for(int u=1;u<=n;u++)
   {
    if(xM[u]==-1)
     {
       memset(chk,false,sizeof(chk));
	    if(SearchPath(u))
		   ret++;
      }
   }
 return ret;
}
int main()
{ 
	int t,k,u,v;
    scanf("%d",&t);
	while(t--)
	{ 
		scanf("%d%d",&n,&k);

		memset(chk,false,sizeof(chk));
		for(int i=0;i<N;i++)
			vis[i].clear();
	   //memset(vis,false,sizeof(vis));	
	   for(int i=1;i<=k;i++)
	   {
	    scanf("%d%d",&u,&v);
		 vis[u].push_back(v);
		 //vis[v].push_back(u);
	   }
		   printf("%d\n",MaxMatch()); 
	}
 return 0;
}


相關文章