Cod sursa(job #517326)

Utilizator APOCALYPTODragos APOCALYPTO Data 28 decembrie 2010 13:57:36
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<cstring>
#define oo 0x3f3f3f3f
#define pb push_back
int viz[30000],ante[30000],q[30000];
ofstream fout("cuplaj.out");
int S,D,sink,M,surs;
vector<int> G[30000];
int C[10005][10005], F[10005][10005];


bool BFS()
{
    memset(ante,0,sizeof(ante));
    memset(q,0,sizeof(q));
    memset(viz,0,sizeof(viz));
    viz[0]=1;
    q[++q[0]]=0;
    int front=1,u;
    vector<int>::iterator it;
    while(front<=q[0])
    {
        u=q[front++];

        for(it=G[u].begin();it<G[u].end();it++)
        {
            if(!viz[*it] && C[u][*it]>F[u][*it])
            {
                viz[*it]=1;
                ante[*it]=u;
                q[++q[0]]=*it;
            }
        }
    }
    return viz[sink];
}

void solve()
{
    int flow,fmin,i;
    for(flow=0;BFS();)
    {
        fmin=oo;
        vector<int>::iterator it;
        for(it=G[sink].begin();it<G[sink].end();it++)
        {
            if(viz[*it])
            {
                fmin=C[*it][sink]-F[*it][sink];

                for(i=*it;i>0;i=ante[i])
                {
                    fmin=min(fmin,C[ante[i]][i]-F[ante[i]][i]);

                }
                F[*it][sink]+=fmin;
                F[sink][*it]-=fmin;

                for(i=*it;i>0;i=ante[i])
                {
                    F[ante[i]][i]+=fmin;
                    F[i][ante[i]]-=fmin;
                }
                 flow+=fmin;
            }
        }
    }
    fout<<flow<<"\n";

    vector<int>::iterator it;
    for(i=1;i<=S;i++)
    {
        for(it=G[i].begin();it<G[i].end();it++)
        {
            if(F[i][*it]==1)
            {
                fout<<i<<" "<<*it-S<<"\n";
            }
        }
    }
}

void cit()
{int x,y,i;
ifstream fin("cuplaj.in");
    fin>>S>>D>>M;
    surs=0;
    sink=S+D+1;
    while(M--)
    {
        fin>>x>>y;
        G[0].pb(x);
        G[x].pb(0);
        G[x].pb(S+y);
        G[S+y].pb(x);
        G[S+y].pb(S+D+1);
        G[S+D+1].pb(S+y);
        C[0][x]=1;
        C[x][S+y]=1;
        C[S+y][sink]=1;

    }
    /*for(i=1;i<=S;i++)
    {
        G[0].pb(i);
        G[i].pb(0);
        C[0][i]=1;


    }
    for(i=1;i<=D;i++)
    {
        C[S+i][sink]=1;
        G[sink].pb(S+i);
        G[S+i].pb(sink);
    }*/
}

int main()
{
   cit();

   solve();
   fout.close();
   return 0;

}