Cod sursa(job #870513)

Utilizator ilenitudorIleni Tudor ilenitudor Data 3 februarie 2013 15:25:40
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout("cuplaj.out");

struct muchie{int x,y;};
muchie s[10001];
int n,m;
int s1;
int s2;
vector<int> v[10001];
int t[10003],x[10003];
int sx;

void Read()
{
    int x,y;
    fin>>s1>>s2>>m;
    n=s1+s2;
    for(int i=1 ; i<=m ; i++)
    {
        fin>>x>>y;
        v[x].push_back(s1+y);
    }

    for(int i=1 ; i<=s1 ; i++)
    v[0].push_back(i);
    n++;
    for(int i=1 ; i<= s2 ; i++)
    v[i+s1].push_back(n);

}

int bf()
{
    int st,dr;
    st=dr=1;
    memset(t,0,sizeof(t));
    memset(x,0,sizeof(x));
    x[1]=0;
    t[0]=-1;
    while(st<=dr)
    {
        for(int i=0 ; i < v[x[st]].size() ; i++)
        {
            int j=v[x[st]][i];
            if(t[j]==0)
            {
                x[++dr] = j;
                t[j]=x[st];
                if(j==n)
                return 1;

            }
        }
        st++;
    }
    return 0;
}
void cuplaj_maxim()
{
    while(bf())
    {
        int j=n;
        while(j!=0)
        {
            for(int i=0 ; i< v[t[j]].size() ; i++ )
            if(v[t[j]][i] == j) v[t[j]].erase(v[t[j]].begin() + i);
            v[j].push_back(t[j]);
            j = t[j];
        }
    }
}
int main()
{
    Read();
    cuplaj_maxim();
    sx=0;
    for(int i=0 ; i < v[n].size() ; i++ )
    s[++sx].y = v[n][i];
    for(int i=1 ; i<=sx ; i++)
        for(int j=0 ; j < v[s[i].y].size() ; j++ )
                s[i].x = v[s[i].y][j];
    fout<<sx;
    for(int i=1 ; i<=sx ; i++)
    {
        fout<<endl;
        fout<<s[i].x<< " "<<s[i].y - s1;
    }

    fin.close();
    fout.close();
}