• P2756 飞行员配对方案问题


    Descrioption

    对于给定的外籍飞行员与英国飞行员的配合情况,

    找出一个最佳飞行员配对方案

    使皇家空军一次能派出最多的飞机

    Solution

    二分图最大匹配裸题

    Code

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 205;
    int n, m;
    int cnt, head[N];
    int link[N], ans;
    bool vis[N];
    
    struct Edge {
        int u, v, _next;
    }G[N * N];
    
    void addedge(int u, int v) {
        G[++cnt] = (Edge) {u, v, head[u]}, head[u] = cnt;
    }
    
    template <typename T>
    void read(T &t) {
        t = 0; T m = 1; char ch = getchar();
        while(ch < '0' || ch > '9') { if(ch == '-') m = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9') { t = (t << 3) + (t << 1) + (ch & 15); ch = getchar(); }
        t *= m;
    }
    
    bool solve(int u) {
        for(int i = head[u]; i ; i = G[i]._next) {
            int v = G[i].v;
            if(vis[v]) continue;
            vis[v] = 1;
            if(link[v] == 0 || solve(link[v])) {
                link[v] = u; return true;
            }
        }
        return false;
    }
    
    int main() {
        read(m), read(n);
        while(true) {
            int a, b; read(a), read(b);
            if(a == b && a == -1) break;
            if(a > m) swap(a, b); 
            addedge(a, b);
        }
        for(int i = 1; i <= m; i++) {
            for(int j = m + 1; j <= n; j++) vis[j] = 0;
            if(solve(i)) ans++;
        }
        if(ans == 0) {
            printf("No Solution!
    ");
        } else {
            printf("%d
    ", ans);
            for(int i = m + 1; i <= n; i++) {
                if(link[i] != 0) {
                    printf("%d %d
    ", link[i], i);
                }
            }
        }
        return 0;
    } 
    
  • 相关阅读:
    linux ss 网络状态工具
    如何安装最新版本的memcached
    如何通过XShell传输文件
    mysql主从复制原理
    聊聊IO多路复用之select、poll、epoll详解
    聊聊 Linux 中的五种 IO 模型
    pytorch中使用cuda扩展
    pytorch中调用C进行扩展
    双线性插值
    python中的装饰器
  • 原文地址:https://www.cnblogs.com/chloristendika/p/10352128.html
Copyright © 2020-2023  润新知