Cod sursa(job #1902726)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 4 martie 2017 19:15:54
Problema Cuplaj maxim in graf bipartit Scor 36
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
#include <algorithm>
#define nmax 20005
#define mmax 200005
using namespace std;
int  F[mmax],C[mmax];
#define F (F+100002)
#define C (C+100002)
struct arc
{
    int ef,nr;
    arc(int a=0, int b=0){ef=a;nr=b;}
};
int n,nou;
vector <arc> a[nmax];
arc t[nmax];
bool viz[nmax];
queue <int> q;
int abs(int x){if (x<0) return -x;return x;}
vector <arc> r;
void bf()
{
    memset(viz,0,sizeof(viz));
    q.push(0);viz[0]=1;
    int x,y,ind,i;
    while (!q.empty())
    {
        x=q.front();q.pop();
        if (x!=n)
        {
            for (i=0;i<a[x].size();i++)
            {
                y=a[x][i].ef;ind=a[x][i].nr;
                if ( (!viz[y]) && (C[ind]>F[ind]) )
                {
                    t[y].ef=x;t[y].nr=ind;
                    viz[y]=1;
                    q.push(y);
                }
            }
        }
    }
}
int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    int n1,n2,m,i,x,y,ind,flm,cup=0;
    fin>>n1>>n2>>m;
    n=n1+n2+1;
    for (i=1;i<=n1;i++)
    {
        nou++;
        a[0].push_back({i,nou});
        a[i].push_back({0,-nou});
        C[nou]=1;
        //C[-nou]=-1;
    }
    for (i=1;i<=m;i++)
    {
        fin>>x>>y;
        nou++;y+=n1;
        a[x].push_back({y,nou});
        a[y].push_back({x,-nou});
        C[nou]=1;
    }
    for (i=n1+1;i<=n-1;i++)
    {
        nou++;
        a[i].push_back({n,nou});
        a[n].push_back({i,-nou});
        C[nou]=1;
    }
    do
    {
        bf();
        for (i=0; i<a[n].size() && viz[n];i++)
        {
            x=a[n][i].ef;ind=abs(a[n][i].nr);
            if ( viz[x] && (C[ind]>F[ind]) )
            {
                t[n].ef=x;t[n].nr=ind;flm=INT_MAX;
                for (x=n; x!=0 && flm; x=t[x].ef)
                {
                    ind=t[x].nr;
                    flm=min(flm,C[ind]-F[ind]);
                }
                if (flm)
                {
                    x=a[n][i].ef;ind=abs(a[n][i].nr);
                    {
                        cup+=flm;
                        r.push_back({t[x].ef,x});
                        //actualizam solutia
                    }
                    for (x=n; x!=0; x=t[x].ef)
                    {
                        ind=t[x].nr;
                        F[ind]+=flm;
                        F[-ind]-=flm;
                    }
                }
            }
        }
    }
    while(viz[n]);
    fout<<cup<<'\n';
    for (i=0;i<cup;i++)
    {
        fout<<r[i].ef<<' '<<r[i].nr-n1<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}