码迷,mamicode.com
首页 > 其他好文 > 详细

网络流24题

时间:2018-09-26 20:49:00      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:i++   区间   ret   有向无环图   unsigned   挑战   魔术   max   span   

挑战中

 

问题编号

问题名称

问题模型

转化模型

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\n",i,j);
                    break;
                }
            }
        }
    }
    return 0;
}

 

网络流24题

标签:i++   区间   ret   有向无环图   unsigned   挑战   魔术   max   span   

原文地址:https://www.cnblogs.com/fht-litost/p/9709376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!