Cod sursa(job #1549427)

Utilizator mihaivasilacheMIhai Vasilache mihaivasilache Data 12 decembrie 2015 12:21:30
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>

using namespace std;
ifstream fin("cuplaj1.in");
ofstream fout("cuplaj1.out");
#define N 4000
#define cin fin
int n;
int l[2*N]; //l[i]=nr de vecninii lui i
int v[N][N]; //v[i][j]=al j-lea vecin
int na;//cate noduri sunt in partea stanga
int c[2*N]; //c[i]=-1, daca i nu este cuplat
//c[i]=j, daca este cuplat cu nodul j
int viz[2*N];
int nb,m;
void initializare_c(int c[2*N],int n,int ini)
{
    int i;
    for(i=0; i<n; i++)
        c[i]=ini;
}
int dfs(int i)
{
    viz[i]=1;
    int j;
    for(j=1; j<=l[i]; j++)
    {
        int k=v[i][j];
        if(viz[k]||c[i]==k) continue;

        if(c[k]==-1)
        {
            c[k]=i;
            c[i]=k;
            viz[k]=1;
            return 1;
        }
        else
        {
            viz[k]=1;
            if(dfs(c[k]))
            {
                c[i]=k;
                c[k]=i;
                return 1;
            }
            else continue;
        }
    }
    return 0;
}
int i;
void greedy()
{
    int i,j;
    for(i=0;i<na;i++)
    {
        if(l[i]!=0)
            for(j=1;j<=l[i];j++)
                if(c[i]==-1&&c[v[i][j]]==-1)
                {
                    viz[i]=1;
                    viz[v[i][j]]=1;
                    c[i]=v[i][j];
                    c[v[i][j]]=i;
                    break;
                }
    }
}
int main()
{
    cin>>na>>nb>>m;
    int x,y;
    n=na+nb;
    for(i=1; i<=m; i++)
    {
        cin>>x>>y;
        x--;
        y--;
        y=y+na;
        l[x]++;
        l[y]++;
        v[x][l[x]]=y;
        v[y][l[y]]=x;
    }
    initializare_c(c,n,-1);
    greedy();
    int ok=1;
    while(ok)
    {
        ok=0;
        initializare_c(viz,n,0);
        for(i=0; i<na; ++i)
            if(!viz[i]&&c[i]==-1)
                if(dfs(i))
                    ok=1;
    }
    int contor=0;
    for(i=0;i<na;i++)
        {
            if(c[i]!=-1)
            {
                contor++;
                fout<<i+1<<' '<<c[i]-na+1<<endl;
            }
        }
    fout<<contor;
    return 0;
}