poj1325

水题:最小顶点覆盖,主要是是注意除掉含有0顶点的边,因为题目中明确规定两种机器最初的状态都是0,故若可以在0状态加工的可不需要启动时间。这样,就只需要知道除开包含0顶点边的最小顶点覆盖个数就可以了——即最大二分匹配。

下面是代码:176K+16MS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 110
int pre[Max];
bool match[Max][Max];
bool vis[Max];
int n,m,k;
int find(int x){ //匈牙利算法求最大二分匹配
	for(int i=1;i<m;i++){
		if(!vis[i] && match[x][i]){
			vis[i]=true;
			if(pre[i]==-1 || find(pre[i])){
				pre[i]=x;
				return true;
			}
		}
	}
	return false;
}
int main(){
	while(scanf("%d",&n),n){
		scanf("%d%d",&m,&k);
		memset(match,0,sizeof(match));
		memset(pre,-1,sizeof(pre));
		int index,a,b;
		while(k--){
			scanf("%d%d%d",&index,&a,&b);
			if(a==0 || b==0)
				continue;
			match[a][b]=true;
		}
		int ans=0;
		for(int i=1;i<=n-1;i++){
			memset(vis,0,sizeof(vis));
			if(find(i))
				ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

发布了209 篇原创文章 · 获赞 20 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章