最大匹配

匈牙利算法
poj1274

#include<iostream>
#include<algorithm>
#include<list>
#include<string.h>
#include<math.h>
#include<vector>
#include<stdio.h>

using namespace std;

#define N 1005
int n,m;
struct node{
	int to;
};
 int match[N];  
 vector<int> g[N]; 
 int used[N]={0};
 bool findMatch(int k) {
 	 for(int i=0;i<g[k].size();i++){
 	 	 int to = g[k][i];
 	 	 if(used[to]==1){
 	 	 	continue;
		   }
 	 	 used[to] = 1 ;
 	 	 if(match[to] ==0||findMatch(match[to])){
 	 	 	match[to] = k;
 	 	 	return true;
		   }
	  }
	  return false;
 } 
  
int main()
{	

	while(cin>>n>>m){
		int total = 0;
		memset(match,0,sizeof(match));
		memset(g,0,sizeof(g));
		memset(used,0,sizeof(used));
		for(int i=1;i<=n;i++){
			int k;
			cin>>k;
			for(int j=0;j<k;j++){
				int stall;
				cin>>stall;
				g[i].push_back(stall);
			}
		}
		for(int i=1;i<=n;i++){
			if(findMatch(i)){
				memset(used,0,sizeof(used));
				total++;
			}
		}
		cout<<total<<endl;
	}
	 
	
    return 0;
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章