传送门 思路:
最小点覆盖=最大值匹配
红色标记的继为最小点覆盖,每条边代表每台机器。我们发现只要三个点,就能覆盖所有机器。
using namespace std;
int G[maxn][maxn], used[maxn], vis[maxn], n;
bool Find(int u) {
int i;
for(i = 1 ; i <= n ; i++) {
if(!vis[i] && G[u][i]) {
///vis[i]表示i男生还没有被别的女生选走
vis[i] = 1;
if(!used[i] || Find(used[i])) {
///如果女生used[i]没有选男生i作伴或者女生used[i]选了男生i,她放弃男生i并且另外找到了自己的伴
///当前还可以挪出来位置
used[i] = u;///就让男生i与女生u作伴
return true;
}
}
}
return false;
}///该函数判断女生能不能找到伴
int main() {
int k, m, i, a, b, ans;
while(cin>>n>>m>>k){
ans = 0;
mem(G, 0);
while(k--) {
int x;
scanf("%d%d%d",&x, &a, &b);
G[a][b] = 1;///G[a][b]表示女生a愿意与男生b作伴
}///used[i]表示i男生与used[i]女生作伴
mem(used, 0);
for(i = 1 ; i <= m ; i++) {
mem(vis, 0);
if(Find(i))
ans++;
}
printf("%d\n", ans);
}
//int zero;
//cin>>zero;
return 0;
}