社区讨论

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 条回复,欢迎继续交流。

正在加载回复...