zoukankan      html  css  js  c++  java
  • 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;
    } 
    
  • 相关阅读:
    一月5日
    一月4日
    Servlet API中forward()与redirect()的区别
    get和post的区别
    java短信验证码实现
    mybatis框架
    springMVC框架
    spring框架
    redis
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/chloristendika/p/10352128.html
Copyright © 2011-2022 走看看