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

Posted Nico&11101001

tags:

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

https://www.luogu.org/problemnew/show/2756

 

二分图网络流

鬼才去写网络流,输出方案?二分图匹配吧

网络流输出方案,枚举与汇点有流量的边,输出方案

#include<cstdio>
#include<cstring>
#include<algorithm>

const int maxn = 10007; 
int m,n;
inline int read() {
    int x=0,f=1;char c=getchar();
    while(c<0||c>9) {if(c==-)f=-1;c=getchar();}
    while(c<=9&&c>=0) x=x*10+c-0,c=getchar();
    return x*f;
}
struct Edge{
    int v,next,flow;
}edge[maxn];int num,head[maxn];
int link[maxn],used[maxn];
inline void add_edge(int u,int v) {
    edge[++num].v=v;edge[num].next=head[u];head[u]=num;
}
bool find(int x,int f) {
    for(int i=head[x];i;i=edge[i].next) {
        int v=edge[i].v;
        if(used[v]!=f) {
            used[v]=f;
            if(link[v]==-1||find(link[v],f)) {
                link[v]=x;return true;
            }
        }
    }
    return false;
}
int main() {
    m=read(),n=read();
    for(int a,b;1101001;) {
        a=read(),b=read();
        if(a<0&&b<0)break;
        add_edge(a,b);
    }
    int ans=0;
    std::memset(link,-1,sizeof link);
    for(int i=1;i<=m;++i) {
        if(find(i,i))ans++;
    }
    printf("%d\n",ans);
    for(int i=m+1;i<=n+m;++i) {
        if(link[i]>0) printf("%d %d\n",link[i],i);
    }
    return 0;
}

 

以上是关于[网络流24题]飞行员配对方案问题的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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