Cod sursa(job #2233752)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 24 august 2018 13:25:49
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define dbg(x) cout << #x << '=' << x << '\n';
#define ll long long
#define pi pair<int,int>
#define pl pair<ll,ll>
#define pd pair<double,double>
#define ld long double
#define pld pair<ld,ld>
#define lg length()
#define sz size()
#define pb push_back
#define MAXN 100005
#define INF 1000000005
#define LINF 1000000000000000005
#define x1 xdddddddddddddddddd
#define y1 ydddddddddddddddddd

int n,m,e,f[240005],c[200005],x,y,z,p[20005],k[20005];

vector <pi> g[20005];

int32_t main(){
    ios_base :: sync_with_stdio(0); cin.tie(); cout.tie();
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");
    cin >> n >> m >> e;
    for(int i=1;i<=e;i++){
        cin >> x >> y;
        g[x].pb({n+y,i});
        g[n+y].pb({x,e+i});
        c[i]=1;
    }
    for(int i=1;i<=n;i++){
        g[0].pb({i,2*e+i});
        g[i].pb({0,2*e+n+i});
        c[2*e+i]=1;
    }
    for(int i=1;i<=m;i++){
        g[n+i].pb({n+m+1,2*e+2*n+i});
        g[n+m+1].pb({n+i,2*e+2*n+m+i});
        c[2*e+2*n+i]=1;
    }
    int gd=0;
    do{
        gd=0;
        for(int i=1;i<=n+m+1;i++) p[i]=-1,k[i]=0;
        queue <int> q;
        q.push(0);
        while(q.sz){
            int t=q.front();
            q.pop();
            for(pi i : g[t]){
                if(p[i.x]==-1 && i.x && i.x!=n+m+1 && f[i.y]<c[i.y]){
                    q.push(i.x);
                    p[i.x]=t;
                    k[i.x]=i.y;
                }
            }
        }
        for(int i=n+1;i<=n+m;i++){
            int s=2*e+n+i;
            if(p[i]!=-1 && f[s]<c[s]){
                gd=1;
                int fl=c[s]-f[s],t=i;
                while(t){
                    fl=min(fl,c[k[t]]-f[k[t]]);
                    t=p[t];
                }
                t=i;
                f[s]+=fl;
                while(t){
                    f[k[t]]+=fl;
                    t=p[t];
                }
            }
        }
    }while(gd);
    int ans=0;
    for(int i=1;i<=m;i++){
        ans+=f[2*e+2*n+i];
    }
    cout << ans << '\n';
    for(int i=1;i<=n;i++){
        for(pi j : g[i]){
            if(f[j.y]){
                cout << i << ' ' << j.x-n << '\n';
            }
        }
    }
}