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

题目链接:传送门

二分图匹配(匈牙利)当然可以网络流写,但是二分图匹配明显简单一些,裸的,这里就不详细讲了。接下来上代码

#include<bits/stdc++.h>
#define rg register
using namespace std;
typedef long long ll;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9')  f= (c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9')  x=x*10+c-48,c=getchar();
    return f*x;
}
struct node{
    int to,next;	
}a[10001];
int head[10001],f[10001],b[10001],cnt;
void add(int x,int y){
    a[++cnt].to=y;
    a[cnt].next=head[x];
    head[x]=cnt;
}
int find(int k){
    for(int i=head[k];i;i=a[i].next){
        int v=a[i].to;
        if(!f[v]){
            f[v]=1;
            if(find(b[v])||!b[v]){
                b[k]=v;
                b[v]=k;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    int n,m,x,y,ans=0;
    n=read(),m=read();
    while(scanf("%d%d",&x,&y)!=EOF){
        if(x==-1&&y==-1)
            break;
        y+=n;
        add(x,y);
        add(y,x);
    }
    for(int i=1;i<=n;i++){
        memset(f,0,sizeof(f));
        ans+=find(i);
    }
    if(ans==0)
        printf("No Solution!"),exit(0);
    printf("%d\n",ans);
    for(int i=1;i<=n;i++)
        if(b[i])
            printf("%d %d\n",i,b[i]-n);
}

posted @ 2018-09-26 17:05  撤云  阅读(142)  评论(0编辑  收藏  举报
……