• p2756 飞行员配对方案问题


    传送门

    题目

    英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    输入格式:

    第 1 行有 2 个正整数 m 和 n。n 是皇家空军的飞行员总数(n<100);m 是外籍飞行员数(m<=n)。外籍飞行员编号为 1~m;英国飞行员编号为 m+1~n。

    接下来每行有 2 个正整数 i 和 j,表示外籍飞行员 i 可以和英国飞行员 j 配合。最后以 2个-1 结束。

    输出格式:

    第 1 行是最佳飞行员配对方案一次能派出的最多的飞机数 M。接下来 M 行是最佳飞行员配对方案。每行有 2个正整数 i 和 j,表示在最佳飞行员配对方案中,飞行员 i 和飞行员 j 配对。如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。

    分析

    简单的二分图匹配的匈牙利算法(好裸的模板题,真的没啥好说的QAQ)

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int n,m,ans;
    int g[1100][1100];
    int used[11000],t,belong[11000];
    bool work(int x){
          int i,j,k;
          for(i=1;i<=m;i++)
             if(used[i]!=t&&g[x][i]){
                 used[i]=t;
                 if(!belong[i]||work(belong[i])){
                     belong[i]=x;
                    return 1;
                }
             }
          return 0;
    }
    void go(){
          int i,j,k;
          for(i=1;i<=n;i++){
               t=i;
               if(work(i))ans++;
          }
    }
    int main()
    {     int i,j,k,x,y;
          cin>>n>>m;
          cin>>x>>y;
          while(x!=-1&&y!=-1){
              g[x][y]=1;
              cin>>x>>y;
          }
          go();
          if(ans){
            cout<<ans<<endl;
            for(i=1;i<=m;i++)
               if(belong[i])cout<<belong[i]<<' '<<i<<endl;
          }else {
              puts("No Solution!");
          }
          return 0;
    }

  • 相关阅读:
    word 快捷键
    java中的各种修饰符作用范围
    pinyin4j的基本使用
    022-pinyin4j工具类模板
    测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除
    测开之路一百四十四:ORM之SQLAlchemy查询
    测开之路一百四十三:ORM框架之SQLAlchemy模型及表创建
    测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作
    测开之路一百四十一:蓝图实现程序模块化
    测开之路一百四十:可拔插视图(基于类、基于方法)
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9039871.html
Copyright © 2020-2023  润新知