Cod sursa(job #2658862)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 15 octombrie 2020 12:36:07
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int NMAX = 20005;
int f[NMAX][NMAX],N,n,m,e,x,y,nod1,nod2,rasp;
bitset <NMAX> c[NMAX],ver;
int tata[NMAX],tata2[NMAX];
vector <int> v[NMAX];
queue <int> q;
bool bfs()
{
    bool rasp=false;
    for(int i=1;i<=NMAX;i++) ver[i]=0;
    ver[0]=1;
    q.push(0);
    tata[0]=-1;
    while(!q.empty()){
        int nod=q.front();
        q.pop();
        for(int i=0;i<v[nod].size();i++){
            int vecin=v[nod][i];
            if(ver[vecin]==0 and c[nod][vecin]>f[nod][vecin]){
                ver[vecin]=1;
                q.push(vecin);
                tata[vecin]=nod;
                if(vecin==N)
                    rasp=true;
            }
        }
    }
    return rasp;
}
int main()
{
    fin >> n >> m >> e;
    N=2*n+1;
    for(int i=1;i<=e;i++){
        fin >> x >> y;
        y+=n;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=1;
        v[0].push_back(x);
        v[x].push_back(0);
        c[0][x]=1;
        if(ver[y]==0) v[N].push_back(y);
        ver[y]=1;
        v[y].push_back(N);
        c[y][N]=1;
    }
    while(bfs()==true){
        for(int i=0;i<v[N].size();i++){
            int nod=v[N][i];
            if(ver[nod]==true and c[nod][N]>f[nod][N]){
                int minim=c[nod][N]-f[nod][N];
                int t=tata[nod];
                while(t!=-1){
                    if(c[t][nod]-f[t][nod]<minim) minim=c[t][nod]-f[t][nod];
                    nod=t;
                    t=tata[t];
                }
                if(minim==0) continue;
                rasp+=minim;
                nod=N;
                t=v[N][i];
                while(t!=-1){
                    f[t][nod]+=minim;
                    f[nod][t]-=minim;
                    nod1=max(nod,t);
                    nod2=min(nod,t);
                    if(f[nod2][nod1]==1) tata2[nod1]=nod2;
                    nod=t;
                    t=tata[t];
                }
            }
        }
    }
    fout << rasp << '\n';
    for(int i=0;i<v[N].size();i++){
        int nod=v[N][i];
        if(f[nod][N]==1) fout << tata2[nod] << ' ' << nod-n << '\n';
    }
    return 0;
}