[解説] P2756 |パイロットプログラムのペアリングの問題

トピックリンク

パイロットプログラムのペアリングの問題

そう、ほとんど唯一の飛行機を運転することができ、パイロットのそれぞれを考えてみましょう、関係のチームは一度だけ使用することができます

外国のパイロットのための\(I:S \ xrightarrow { 1} iが\)

英国のパイロットのための\(jはj個の\ xrightarrow { 1} T \)

関係のセットのための\(:私は\ I、J xrightarrow {1} jは\)

\(S \)する\(T \)レコードに最大の流路を実行します

(\)の後\後継配列は、ポイントを記録します

(入力における問題ので\(iは\)およびJ \)\(すなわち、二部グラフの最大マッチング、レコードへのパイロットのためのマッチングポイントとして実行することができるように、確かに等しくありません)

\(\ mathcal {コード}:\)

#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
#define int long long
#define debug cout<<__LINE__<<" "<<__FUNCTION__<<"\n"
inline int read(){
    int x=0,y=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*y;
}
int n,m,s,t,dep[N];
int head[N],tot=1,front,used[N];
int ans;
int after[N];
struct Node{
    int nxt,to,dis;
}edge[N<<2];
inline void add(int x,int y,int z){
    edge[++tot].nxt=head[x];
    edge[tot].to=y;
    edge[tot].dis=z;
    head[x]=tot;
}
queue<int> q;
inline int bfs(){
    register int i;
    for(i=0;i<=n+1;i++) dep[i]=-1, used[i]=head[i];
    dep[s]=0;
    q.push(s);
    while(!q.empty()){
        front=q.front();q.pop();
//      cout<<front<<" ";debug;
        for(i=head[front];i;i=edge[i].nxt){
            if(edge[i].dis&&dep[edge[i].to]==-1){
                dep[edge[i].to]=dep[front]+1;q.push(edge[i].to);
            }
        }
    }
//  debug;
    return dep[t]!=-1;
}
int dfs(int now,int limit){
    if(!limit||now==t) return limit;
    int flow=0;
    for(int &i=used[now],pro;i;i=edge[i].nxt){
        if(dep[edge[i].to]==dep[now]+1&&edge[i].dis){
            pro=dfs(edge[i].to,min(limit,edge[i].dis));
            if(!pro) continue;
            edge[i].dis-=pro;
            edge[i^1].dis+=pro;
            flow+=pro;
            limit-=pro;
            after[now]=edge[i].to;//记录路径
            if(!limit) return flow;
        }
    }
//  cout<<flow<<" ";debug;
//  system("pause");
    return flow;
}
inline void Dinic(){
    while(bfs()){ans+=(dfs(s,10000000001LL));}
}
signed main(){
//  freopen("a.in","r",stdin);
//  freopen(".out","w",stdout);
    m=read();n=read();
    s=0;t=n+1;
    for(int i=1;i<=m;i++) add(s,i,1),add(i,s,0);
    for(int i=m+1;i<=n;i++) add(i,t,1),add(t,i,0);
    int x=read(),y=read();
    while(x!=-1&&y!=-1){
        add(x,y,1);add(y,x,0);
        x=read();y=read();
    }
    Dinic();
    if(ans==0){//无解情况
        puts("No Solution!");return 0;
    }
    cout<<ans<<"\n";
    for(int i=1;i<=m;i++){
        if(after[i]){
            cout<<i<<" "<<after[i]<<"\n";
        }
    }
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

おすすめ

転載: www.cnblogs.com/end-of-mind/p/11535767.html