水题:最小顶点覆盖,主要是是注意除掉含有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;
}