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

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

时间:2017-12-26 21:06:38      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:==   问题   pre   org   ring   find   方案   amp   flow   

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题]飞行员配对方案问题

标签:==   问题   pre   org   ring   find   方案   amp   flow   

原文地址:https://www.cnblogs.com/sssy/p/8119697.html

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