Cod sursa(job #2409090)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 18 aprilie 2019 17:43:22
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n1,n2,m;
vector <int> ADJ[20001];
int COLOR[20001];
int SPOUSE[20001];
int k;
int X[10001],Y[10001];
int P[20001],VIZ[20001];

/// returneaza 0 daca nu exista apath
/// returneaza 1 daca exista apath
/// in acest caz se obtine si X[1]Y[1]...X[k]Y[k]
int apath()
{
    vector <int> :: iterator it;
    for (int i=1;i<=n1+n2;i++)
        VIZ[i]=P[i]=0;
    queue <int> Q;
    for (int i=1;i<=n1;i++)
        if (COLOR[i]==0)
        {
            Q.push(i);
            VIZ[i]=1;
        }
    while (!Q.empty())
    {
        int v;
        v=Q.front();
        Q.pop();
        if (v<=n1)
            for (it=ADJ[v].begin();it!=ADJ[v].end();it++)
            {
                int vecin;
                vecin=(*it);
                if (VIZ[vecin]==0)
                    if (SPOUSE[vecin]!=v)
                    {
                        P[vecin]=v;
                        VIZ[vecin]=1;
                        Q.push(vecin);
                        if (COLOR[vecin]==0)
                        {
                            k=0;
                            int c;
                            c=vecin;
                            while (c!=0)
                            {
                                k++;
                                X[k]=P[c];
                                Y[k]=c;
                                c=P[P[c]];
                            }
                            return 1;
                        }
                    }
            }
        else
        {
            int vecin;
            vecin=SPOUSE[v];
            if (VIZ[vecin]==0)
            {
                P[vecin]=v;
                VIZ[vecin]=1;
                Q.push(vecin);
            }
        }
    }
    return 0;
}

int main()
{
    fi>>n1>>n2>>m;
    for (int i=1;i<=m;i++)
    {
        int a,b;
        fi>>a>>b;
        b=b+n1;
        ADJ[a].push_back(b);
    }
    /// initializare
    for (int i=1;i<=n1+n2;i++)
        COLOR[i]=SPOUSE[i]=0;
    while (1)
    {
        /// se cauta un apath
        int t;
        t=apath();
        if (t==0)
            break;
        COLOR[X[k]]=COLOR[Y[1]]=1;
        for (int i=k;i>=1;i--)
            SPOUSE[Y[i]]=X[i];
    }
    int rez;
    rez=0;
    for (int i=1;i<=n1;i++)
        if (COLOR[i]==1)
            rez++;
    fo<<rez<<"\n";
    for (int i=n1+1;i<=n1+n2;i++)
        if (SPOUSE[i]!=0)
            fo<<SPOUSE[i]<<" "<<i-n1<<"\n";
    fi.close();
    fo.close();
    return 0;
}