飞行员配对方案问题

二分图匹配即可水过
没什么可说的

//Writer:jr HSZ;%%%WJMZBMR
#include<bits/stdc++.h>
#define LL long long
#define reg register int
#define f(i,a,b) for(reg i=a;i<=b;i++)
using namespace std;
int m,n,ans;
int match[2005];
bool used[2005];
struct E {
    int nxt,to;
} e[2005];
int head[2005],cnt;
void add(int bg,int ed) {
    e[++cnt].nxt=head[bg];
    e[cnt].to=ed;
    head[bg]=cnt;
}
bool dfs(int x) {
    for(int i=head[x]; i; i=e[i].nxt) {
        int v=e[i].to;
        if(!used[v]) {
            used[v]=1;
            if(!match[v]||dfs(match[v])) {
                match[v]=x;
                return 1;
            }
        }

    }
    return 0;
}
int u,v;
int main() {
    cin>>n>>m;
    for(;;) {
        scanf("%d%d",&u,&v);
        if(u==-1&&v==-1)break;
        add(u,v);
    }
    for(int i=1; i<=n; i++) {
        memset(used,0,sizeof used);
        if(dfs(i))ans++;
    }
    if(!ans)cout<<"No Solution!";
    else {
        cout<<ans<<endl;
        f(i,1,m) {
            if(match[i])
            printf("%d %d\n",match[i],i);
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9266151.html