注意机器一开始在0_mode下工作,所以一开始就相当于选了0号节点。我们只需跑 残余图的最小顶点覆盖。而这等价于最大匹配。
算法写的很巧妙,仔细理解。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int map[105][105],match[105];;
bool vis[105];
int n,m,k;
bool dfs(int i){
for (int j=0;j<m;j++){
if (!vis[j]&&map[i][j]){
vis[j]=true;
if (match[j]==-1||dfs(match[j])){
match[j]=i;
return true;
}
}
}
return false;
}
int Match(){
int ret=0;
memset(match,-1,sizeof(match));
for (int i=0;i<n;i++){
memset(vis,false,sizeof(vis));
ret+=dfs(i);
}
return ret;
}
int main(){
int x,t1,t2;
while (~scanf("%d",&n),n){
scanf("%d%d",&m,&k);
memset(map,0,sizeof(map));
for (int i=0;i<k;i++){
scanf("%d%d%d",&x,&t1,&t2);
if (t1>0&&t2>0){
map[t1][t2]=1;
}
}
printf("%d\n",Match());
}
return 0;
}