[网络流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;
}

 

posted @ 2017-12-26 19:42  zzzzx  阅读(124)  评论(0编辑  收藏  举报