网络流24题

Posted fht-litost

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流24题相关的知识,希望对你有一定的参考价值。

挑战中

 

问题编号

问题名称

问题模型

转化模型

1

飞行员配对方案问题

二分图最大匹配

网络最大流 

2

太空飞行计划问题

最大权闭合图

网络最小割 

3

最小路径覆盖问题

有向无环图最小路径覆盖

网络最大流     

4

魔术球问题

有向无环图最小路径覆盖

网络最大流 

5

圆桌问题

二分图多重匹配

网络最大流 

6

最长递增子序列问题

最多不相交路径

网络最大流

7

试题库问题

二分图多重匹配

网络最大流      

8

机器人路径规划问题

(未解决)

最小费用最大流

9

方格取数问题

二分图点权最大独立集

网络最小割

10

餐巾计划问题

线性规划网络优化

最小费用最大流

11

航空路线问题

最长不相交路径

最小费用最大流

12

软件补丁问题

最小转移代价

最短路径

13

星际转移问题

网络判定

网络最大流

14

孤岛营救问题

分层图最短路径

最短路径

15

汽车加油行驶问题

分层图最短路径

最短路径

16

数字梯形问题

最大权不相交路径

最小费用最大流

17

运输问题

网络费用流量

最小费用最大流

18

分配问题

二分图最佳匹配

最小费用最大流

19

负载平衡问题

最小代价供求

最小费用最大流

20

深海机器人问题

线性规划网络优化

最小费用最大流

21

最长k可重区间集问题

最大权不相交路径

最小费用最大流

22

最长k可重线段集问题

最大权不相交路径

最小费用最大流

23

火星探险问题

线性规划网络优化

最小费用最大流

24

骑士共存问题

二分图最大独立集

网络最小割

 

1. 飞行员配对方案问题

https://www.oj.swust.edu.cn/problem/show/1736

二分图最大匹配。超级源点连外籍飞行员,容量为1。匹配的外籍和英国飞行员间连一条边,容量为1。英国飞行员与超级汇点连一条边,容量为1。跑最大流,输出匹配的对。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define random(a, b) rand()*rand()%(b-a+1)+a
#define pi acos(-1)
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
const int maxn = 1000 + 10;
const int maxm = 3000000 +10;
const int mod = 1000000000;

int maze[maxn][maxn];
int gap[maxn],dis[maxn],pre[maxn],cur[maxn];
int sap(int start,int ed,int nodenum){
    memset(cur,0,sizeof(cur));
    memset(dis,0,sizeof(dis));
    memset(gap,0,sizeof(gap));
    int u = pre[start]=start,maxflow=0,aug=-1;
    gap[0]=nodenum;
    while(dis[start]<nodenum){
        loop:
            for(int v =cur[u];v<nodenum;v++){
                if(maze[u][v]&&dis[u]==dis[v]+1){
                    if(aug==-1||aug>maze[u][v]) aug = maze[u][v];
                    pre[v]=u;
                    u=cur[u]=v;
                    if(v==ed){
                        maxflow+=aug;
                        for(u=pre[u];v!=start;v=u,u=pre[u]){
                            maze[u][v]-=aug;
                            maze[v][u]+=aug;
                        }
                        aug=-1;
                    }
                    goto loop;
                }
            }
            int mindis = nodenum-1;
            for(int v=0;v<nodenum;v++){
                if(maze[u][v]&&mindis>dis[v]){
                    cur[u]=v;
                    mindis=dis[v];
                }
            }
            if((--gap[dis[u]])==0) break;
            gap[dis[u]=mindis+1]++;
            u=pre[u];
    }
    return maxflow;
}

int main(){
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif // LOCAL
    int n,m;
    while(~scanf("%d%d",&m,&n)){
        memset(maze,0,sizeof(maze));
        for(int i=1;i<=m;i++) maze[0][i]=1;
        for(int i=m+1;i<=n;i++) maze[i][n+1]=1;
        int x,y;
        while(true){
            scanf("%d%d",&x,&y);
            if(x==-1&&y==-1) break;
            maze[x][y]=1;
        }
        int ans=sap(0,n+1,n+2);
        cout<<ans<<endl;

        for(int i=1;i<=m;i++){
            for(int j=m+1;j<=n;j++){
                if(maze[i][j]==0&&maze[j][i]==1){
                    printf("%d %d
",i,j);
                    break;
                }
            }
        }
    }
    return 0;
}

 

以上是关于网络流24题的主要内容,如果未能解决你的问题,请参考以下文章

网络流24题 软件补丁问题

网络流24题 软件补丁问题

网络流24题-飞行员配对方案问题-二分图最大匹配

网络流24题 飞行员配对方案问题

网络流24题 飞行员配对方案问题

[网络流24题] 餐巾计划问题 [费用流]