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

本文介绍了一种解决飞行员配对方案问题的方法,采用最大流算法模板实现。通过构造网络流图并利用BFS和DFS算法求解最大流,进而得出可行的配对方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Time Limit:10000MS  Memory Limit:512000K
Total Submit:41 Accepted:10 
Case Time Limit:1000MS

Description

Input

Output

Sample Input


Sample Output


Hint

不用输出方案

Source


题解:最大流模版



#include <vector>

#include<iostream>  

#include <queue>  
#include <cstdio>  
#include <cstring>  
using namespace std;  

  

const int INF = 200;

const int maxn = 105;  
  
struct edge{  
   int from,to,cap,flow;  
};  
vector<edge> edges;  
vector<int> g[maxn];  
int d[maxn],cur[maxn];  
bool vst[maxn];  
int n,m,s,t;  
void Init()  
{  
    for(int i = 0;i < maxn;++i)  
        g[i].clear();  
    edges.clear();  
}  
void addedge(int from,int to,int cap)  
{  
    edges.push_back((edge){from,to,cap,0});  
    edges.push_back((edge){to,from,0,0});  
    int sz = edges.size();  
    G[from].push_back(sz-2);  
    G[to].push_back(sz-1);  
}    
bool bfs()  
{  
    memset(vst,false,sizeof(vst));  
    queue<int> q;  
    q.push(s);  
    d[s] = 0;  
    vst[s] = true;  
    while(!q.empty()){  
        int u = q.front();  
        q.pop();  
        for(int i = 0;i < (int)g[u].size();++i){  
            Edge& e = edges[g[u][i]];  
            if(!vst[e.to]&&e.cap > e.flow){  
                d[e.to] = d[u]+1;  
                vst[e.to] = true;  
                q.push(e.to);  
            }  
        }   
    }  
    return vst[t];  
}  
int dfs(int u,int a)  
{  
    if(u==t||a==0)  
        return a;  
    int f,flow = 0;  
    for(int& i = cur[u];i < (int)g[u].size();++i){  
        edge& e = edges[G[u][i]];  
        if(d[e.to]==d[u]+1&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){  
            e.flow += f;  
            edges[G[u][i]^1].flow -= f;  
            flow += f;  
            a -= f;  
            if(a==0)break;  
        }  
    }  
    return flow;  
}  
int maxflow()  
{  
    int flow=0;  
    while(bfs()){  
        memset(cur,0,sizeof(cur));  
        flow+=dfs(s,INF);  
    }  
    return flow;  
}  
int main()  
{  
    while(~scanf("%d%d",&n,&m)){  
        Init();  
        int x,y;  
        while(scanf("%d%d",&x,&y),(x!=-1&&y!=-1)){  
        addedge(x,y,1);  
        }  
        s = 0,t = m+1;  
        for(int i = 1;i <= n;++i)addedge(s,i,1);  
        for(int i = n+1;i <= m;++i)addedge(i,t,1);  
        int res = maxflow();  
        if(res<=0)  
            puts("No Solution!");  
        else{  
            printf("%d\n",res);  
            int sz = edges.size();  
            for(int i = 0;i < sz;i += 2){  
                edge& e = edges[i];  
                if(e.flow == 1&&e.from!=s&&e.to!=t)  
                    printf("%d %d\n",e.from,e.to);  
            }  
        }  
    }  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值