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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章