线性规划与网络流24题——01飞行员配对方案问题

解决二战时期英国皇家空军外籍与本土飞行员的最优配对问题,通过构建二分图并运用Dinic最大流算法找到可同时派出最多飞机的配对方案。

 1736:飞行员配对方案问题

Time Limit:1000MS  Memory Limit:65536K
Total Submit:44 Accepted:29 Page View:286 Special Judged

[Submit]   [Status]   [Discuss]

Font Size:  Aa  Aa  Aa

Description

第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出

的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞

行员,另1 名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英

国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的

外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空

军一次能派出最多的飞机。

对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,

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

Input

由文件input.txt提供输入数据。文件第1 行有2个正整数m和n。n是皇家空军的飞行

员总数(n<100);m是外籍飞行员数。外籍飞行员编号为1~m;英国飞行员编号为m+1~n。

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

个-1 结束。

Output

程序运行结束时,将最佳飞行员配对方案输出到文件output.txt 中。第1 行是最佳飞行
 
   
 
   
员配对方案一次能派出的最多的飞机数M。接下来M 行是最佳飞行员配对方案。每行有2

个正整数i和j,表示在最佳飞行员配对方案中,飞行员i和飞行员j 配对。

如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。

Sample Input

5 10

1 7

1 8

2 6

2 9

2 10

3 7

3 8

4 7

4 8

5 10

-1 -1

Sample Output

4

1 7

2 9

3 8

5 10


「Solution」

一个二分图最大匹配问题。

考虑在二分图的基础上增加源S和汇T。

1、S向X集合中每个顶点连一条容量为1的有向边。

2、Y集合中每个顶点向T连一条容量为1的有向边。

3、XY集合之间的边都设为从A集合中的点到B集合之中的点,容量为1的有向边。

求网络最大流,流量就是匹配数,所有满流边是一组可行解。


「代码」
//Dinic By Joker0429
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 10020
#define INF 1 << 30
using namespace std;
int n, m, s, t, tot, ans, d[maxn], head[maxn], dist[maxn];
struct E
{
    int from, to, next, tab;
}edge[maxn];
   
void add_edge(int u, int v, int f)
{
    tot++;
    edge[tot].from = u, edge[tot].to = v, edge[tot].tab = f, edge[tot].next = head[u], head[u] = tot;
    tot++;
    edge[tot].from = v, edge[tot].to = u, edge[tot].tab = 0, edge[tot].next = head[v], head[v] = tot;
}
   
int dfs(int x, int low)
{
    int a;
    if (x == t) return low;
    for (int i = head[x]; i != -1; i = edge[i].next)
        if (edge[i].tab > 0 && dist[edge[i].to] == dist[x] + 1 && (a = dfs(edge[i].to, min(edge[i].tab, low))))
        {
            edge[i].tab -= a, edge[i^1].tab += a;
            return a;
        }
    return 0;
}
   
int bfs()
{
    int l, r, k;
    memset(dist,0xff,sizeof(dist));
    d[0] = 0;
    d[1] = s;
    l = 0, r = 1;
    dist[s] = 0;
    while (l < r)
    {
        k = d[++l];
        for (int i = head[k]; i != -1; i = edge[i].next)
            if (edge[i].tab > 0 && dist[edge[i].to] < 0) dist[edge[i].to] = dist[k] + 1, d[++r] = edge[i].to;
    }
    if (dist[t] > 0) return 1; else return 0;
}
   
void dinic()
{
    ans = 0;
    while (bfs()) ans += dfs(0,INF);
}
   
void print()
{
    if (ans == 0)
    {
        printf("No Sulotion\n");
        return;
    }
    printf("%d\n",ans);
    for (int i = 0; i <= tot; i += 2)
        if (edge[i].tab == 0 && edge[i].from != s && edge[i].to != t) printf("%d %d\n", edge[i].from, edge[i].to);
}
   
int main()
{
    int x, y;
    memset(head,0xff,sizeof(head));
    tot = -1;
    while (~scanf("%d %d", &m, &n))
    {
        s = 0, t = n + 1;
        for (int i = 1; i <= m; i++) add_edge(0, i, 1);
        for (int i = m+1; i <= n; i++) add_edge(i, t, 1);
        while (~scanf("%d %d", &x, &y)) if (x == -1 && y == -1) break; else add_edge(x, y, 1);
        dinic();
        print();
    }
    return 0;
}


【源码免费下载链接】:https://renmaiwang.cn/s/anwse 在探索使用vue-cli和HBuilderx进行应用程序打包的过程中,我们可能会遇到许多常见的问题和陷阱。根据文件提供的内容,我们可以梳理出以下几点关键知识点:1. 微信授权登录问题:在使用vue-cli构建的HBuilderx应用中,微信授权登录时可能会遇到code:-2或code:-100的错误提示。这些问题通常指向几个方面:appid和appsecret必须针对移动应用设置,而不是网页应用;微信登录和分享功能在自定义基座环境中可能不可用;再次,开发者账号配置的应用签名应该是经过md5加密后的值,而不是原字符串。2. 生产环境配置问题:生产环境下,proxyTable可能不生效,从而导致接口访问出现500错误。解决这个问题有两条途径:一是使用网络地址作为入口文件,并确保入口文件和接口处于同一域名下;二是推荐在config/prod.env和config/dev.env中添加API_ROOT,并在main.js里通过axios设置正确的baseUrl,以解决接口路径问题。3. 资源路径问题:在打包过程中,背景图片使用相对路径可能导致测试时图片不显示。为避免这种情况,需要确保css文件中背景图片的路径设置正确,并调整config/index.js中关于资源路径的配置。4. 微博分享功能问题:微博分享功能在某些情况下可能会闪退,这是由于Dcloud的一个已知问题导致的。授权失败的原因可能有两个:网络问题或未安装新浪微博应用。在进行授权时需要加入判断逻辑,根据授权失败的具体情况给出提示。5. iPhoneX适配问题:在iPhoneX上由于底部安全区的存在,可能会导致导航栏不能正确地显示在最底部。为解决这一问题,在index.html的<meta>标签中添加viewport-fit=cover,以适
内容概要:本文为第七届全球校园人工智能算法精英大赛(算法创新赛)的赛规则文件,详细介绍了六大开放式赛的内容、作品要求、材料规范及评分标准。六大赛分别为:算法模型创新(AC1)、智能软件创新(AC2)、智能硬件创新(AC3)、AI+应用创新(AC4)、AI+创新创业(AC5)和AI+未来场景(AC6),每项赛均提供技术方案参考大纲评分规则,涵盖项目背景、技术实现、创新性、应用价值等多个维度。文件强调作品的原创性、创新性、实用性完整性,并对提交材料的形式内容作出明确规范,如PDF文档格式、演示视频时长、答辩PPT要求等。此外,各赛评分体系均设置总分100分及附加分,注重技术创新落地潜力的综合评估。; 适合人群:高校在校学生,尤其是具备一定人工智能、软件开发、硬件设计或创新创业基础的本科生研究生,适合跨学科团队参不同赛方向。; 使用场景及目标:①指导参赛团队根据所选赛准备完整的技术方案或商业计划书;②帮助团队理解评审标准,提升作品在创新性、技术实现、应用价值等方面的竞争力;③促进人工智能技术在实际场景中的融合应用成果转化。; 阅读建议:建议参赛者结合自身专业背景选择合适赛,仔细研读对应的技术方案大纲评分细则,注重方案的逻辑性、创新性和可实施性,同时严格按照材料规范准备提交内容,避免因格式或信息泄露等问题影响评审成绩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值