水題:最小頂點覆蓋,主要是是注意除掉含有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;
}