匈牙利算法模板

const int MAXN = 205;

bool board[MAXN][MAXN];//存边 
int color[MAXN];//用于染色法判断是否是二分图 
int N,M;//N个点M条边 

bool Judge(int x){
	for(int i=1 ; i<=N ; ++i){
		if(board[x][i] == 0)continue;
		if(color[x] == color[i])return false;
		if(color[i] == 0){
			color[i] = 3-color[x];
			if(!Judge(i))return false;
		}
	}
	return true;
}

int pre[MAXN];
bool used[MAXN];

int Find(int x){
	for(int i=1 ; i<=N ; ++i){
		if(board[x][i]){
			if(used[i])continue;
			used[i] = true;
			if(pre[i] == 0 || Find(pre[i])){
				pre[i] = x;
				return 1;
			}
		}
	}
	return 0;
}

inline void init(){
	memset(board,false,sizeof board);
	memset(color,0,sizeof color);
	memset(pre,0,sizeof pre);
}

int main(){
	
	while(scanf("%d %d",&N,&M)!=EOF){
		init();
		while(M--){
			int a,b;
			scanf("%d %d",&a,&b);
			board[a][b] = board[b][a] = true;
		}
		color[1] = 1;
		if(!Judge(1)){
			printf("No\n");
			continue;
		}
		int sum = 0;
		for(int i=1 ; i<=N ; ++i){
			memset(used,false,sizeof used);
			sum += Find(i);
		} 
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/vocaloid01/article/details/81085194