Loj #6000.「 网络流 24 题 」搭配飞行员

放图片是不是很骚气

解题思路

建立超级源点和超级汇点。将主驾驶雨源点相连,副驾驶与汇点相连,再把输入的有向边加进去,同时建反边。

跑$Dinic$,网络流模板不难,难的是建模QAQ

附上代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxnode = 105, maxedge = 30003, INF = 2147483647;
int n, m, s, t, head[maxnode], cnt = 1, Depth[maxnode], Ans;
struct Edge {
    int nxt, v, w;
}ed[maxedge];
inline void addedge(int u, int v, int w) {
    ed[++cnt].nxt = head[u];
    ed[cnt].v = v, ed[cnt].w = w;
    head[u] = cnt;
}
inline bool BFS() {
    queue <int> Q;
    memset(Depth, 0, sizeof(Depth));
    Depth[s] = 1, Q.push(s);
    int u;
    while (!Q.empty()) {
        u = Q.front();
        Q.pop();
        for(int i=head[u]; i; i=ed[i].nxt) {
            if(Depth[ed[i].v] == 0 && ed[i].w > 0) {
                Depth[ed[i].v] = Depth[u] + 1;
                Q.push(ed[i].v);
                if(ed[i].v == t) return true;
            }
        }
    }
    return false;
}
inline int Dinic(int u, int cap) {
    if(u == t) return cap;
    int delta;
    for(int i=head[u]; i; i=ed[i].nxt) {
        if(ed[i].w > 0 && Depth[ed[i].v] == Depth[u] + 1) {
            delta = Dinic(ed[i].v, min(cap, ed[i].w));
            if(delta > 0) {
                ed[i].w -= delta;
                ed[i^1].w += delta;
                return delta;
            }
        }
    }
    return 0;
}
int main() {
    scanf("%d%d", &n, &m);
    s = 0, t = n+1;
    for(int i=1; i<=m; i++) addedge(s, i, 1), addedge(i, s, 0);
    for(int i=m+1; i<=n; i++) addedge(i, t, 1), addedge(t, i, 0);
    static int x, y;
    while (scanf("%d%d", &x, &y) == 2) addedge(x, y, 1), addedge(y, x, 0);
    while (BFS()) Ans += Dinic(s, INF);
    printf("%d", Ans);
}

原文地址:https://www.cnblogs.com/bljfy/p/9543665.html

时间: 2024-10-07 13:09:24

Loj #6000.「 网络流 24 题 」搭配飞行员的相关文章

LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

#6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多. 因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行. 输入格式 第一

「网络流 24 题」搭配飞行员

#include<bits/stdc++.h> using namespace std; int m,n,tot=-1,h[1005],ans=0,tp=0; struct node{ int from,next,to,rest; int last; }e[10005]; void add(int x,int y,int z){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].from=x; e[tot].to=y; e[tot].rest=z; } int

[日常摸鱼]loj6000「网络流 24 题」搭配飞行员

题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. #include<cstdio> #include<algorithm> #define rep(i,n) for(register int i=1;i<=n;i++) #define REP(i,a,b) for(register int i=a;i<=b;i++) u

「网络流24题」1. 飞行员配对方案问题

「网络流24题」1. 飞行员配对方案问题 <题目链接> 比较经典的一道二分图最大匹配. 匈牙利算法走起啊. 算出答案后,输出每个外籍飞行员匹配的点(如果有)即可. 匈牙利算法,简而言之就是,每个x部点u去找自己能匹配上的第一个y部点v,如果v还没有被匹配,或是v已经匹配的x部点w还能匹配其他y部点)就将x与y匹配. 「如果我除了她(v)还能追到别的妹子,我就把她让给你.」--w对x如是说. 代码简明易懂. #include <cstdio> #include <cstring

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在

LOJ #6008. 「网络流 24 题」餐巾计划

#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir?i?? 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分:或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.

LOJ #6010. 「网络流 24 题」数字梯形

#6010. 「网络流 24 题」数字梯形 题目描述 给定一个由 n nn 行数字组成的数字梯形如下图所示.梯形的第一行有 m mm 个数字.从梯形的顶部的 m mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别遵守以下规则: 从梯形的顶至底的 m mm 条路径互不相交: 从梯形的顶至底的 m mm 条路径仅在数字结点处相交: 从梯形的顶至底的 m mm 条路径允许在数字结点相交或边相交. 输入格式 第 1 11 行中有 2 22 个正整数 m mm 和

*LOJ#6227. 「网络流 24 题」最长k可重线段集问题

$n \leq 500$条平面上的线段,问一种挑选方法,使得不存在直线$x=p$与挑选的直线有超过$k$个交点,且选得的直线总长度最长. 横坐标每个点开一个点,一条线段就把对应横坐标连一条容量一费用(-长度)的边:点$x$向点$x+1$连一条容量$k$费用0的边.这里的$k$边限制的是直线上其他不经过这里的地方. 这里有个trick就是有与$x$轴垂直的线段.直接判掉会wa.为此把坐标扩大两倍,如果$l=r$那么$r++$否则$l++$,相当于把一个点拆成两个. 原文地址:https://www

LiberOJ #6002. 「网络流 24 题」最小路径覆盖

#6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 给定有向图 G=(V,E) G = (V, E)G=(V,E).设 P PP 是 G GG 的一个简单路(顶点不相交)的集合.如果 V VV 中每个顶点恰好在 P PP 的一条路上,则称 P PP 是 G GG 的一个路径覆盖.P PP 中路径可以从 V VV 的任何一个顶点开始,