社区讨论
90分自创算法求Hack玄关
P3386【模板】二分图最大匹配参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhja4m20
- 此快照首次捕获于
- 2025/11/03 23:12 4 个月前
- 此快照最后确认于
- 2025/11/03 23:12 4 个月前
RT
CPP#include<bits/stdc++.h>
using namespace std;
vector<int> a[1010]; //左到右
vector<int> b[1010]; //右到左
int ans;
bool left_used[1010], right_used[1010];
int Size(int j){ // 实际存在的孩子数量
int cnt = 0;
for(int v : a[j]){
if(!right_used[v]) cnt++;
}
return cnt;
}
int main(){
int n , m , e;
cin >> n >> m >> e;
for(int i = 1; i <= e; i++){
int x , y;
cin >> x >> y;
a[x].push_back(y);
b[y].push_back(x);
}
//杀虫剂
while(true){
int min_j = -1, min_val = INT_MAX;
for(int j = 1; j <= n; j++){ // 打擂台
if(!left_used[j]){
int s = Size(j);
if(s > 0 && s < min_val){
min_val = s;
min_j = j;
}
}
}
if(min_j == -1) break; //没了就走
int v = -1;
for(int u : a[min_j]){
if(!right_used[u]){
v = u; //配对
break;
}
}
if(v == -1) continue; //配不上活该
left_used[min_j] = true; // 左用过了
right_used[v] = true; // 右用过了
ans++; // 数量++
}
cout << ans << endl;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...