Cod sursa(job #873685)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 7 februarie 2013 15:57:34
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.6 kb
#include<queue>
#include<string.h>
#include<stdio.h>   // mesaj pentru visan:
#include<vector>   // Teo te idolatrizeaza ! a facut un vector cu numele
using namespace std; // visite = Vi(san)Site ; Congrats !
 FILE*in=fopen("cuplaj.in","r");  // si ,daca nu stiai, greedy=izuri ;
FILE*out=fopen("cuplaj.out","w");
const int MAXSIZE=20003;
int flux[MAXSIZE][MAXSIZE];
bool cap[MAXSIZE][MAXSIZE];
int tata[MAXSIZE],maxflow;
vector < pair<int,int> > answer;
bool bfs();
int noduriS,noduriD,muchii,solutie;
vector <int> a[MAXSIZE];
int main()
{
    fscanf(in,"%d%d%d",&noduriS,&noduriD,&muchii);
    for(int i=1;i<=muchii;++i)
    {
        int data1,data2;
        fscanf(in,"%d%d",&data1,&data2);
        data2+=noduriS;
        a[data1].push_back(data2);
        a[data2].push_back(data1);
        cap[data1][data2]=1;
    }
    for(int i=1;i<=noduriS;++i)
        {
            cap[0][i]=true;
            a[0].push_back(i);
        }
    noduriD+=(noduriS+1);
    for(int i=noduriS+1;i<noduriD;++i)
        {
            a[i].push_back(noduriD);
            a[noduriD].push_back(i);
            cap[i][noduriD]=true;
        }
    while(bfs())
    {
        for(int j=0;j<(int)a[noduriD].size();++j)
        {
            if(tata[a[noduriD][j]]==-1 || cap[a[noduriD][j]][noduriD]==flux[a[noduriD][j]][noduriD])
                continue;
            tata[noduriD] = a[noduriD][j];
            int minim=100001;
            for(int i=noduriD;i;i=tata[i])
                minim=min(minim,(int)cap[tata[i]][i]-flux[tata[i]][i]);
            if(!minim)
                continue;
            for(int i=noduriD;i;i=tata[i])
            {
                solutie = i;
                ++flux[tata[i]][i];
                --flux[i][tata[i]];
            }
            answer.push_back(make_pair(solutie,(int)a[noduriD][j]-noduriS));
            maxflow++;
        }
    }
    fprintf(out,"%d\n",maxflow);
    for(int i=0;i<(int)answer.size();++i)
        fprintf(out,"%d %d\n",answer[i].first,answer[i].second);


fclose(in);
fclose(out);
}
bool bfs()
{
    memset(tata,-1,sizeof(tata));
    queue <int> q;
    q.push(0);
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        if(nod==noduriD)
            break;
        for(int i=0;i<(int)a[nod].size();++i)
        {
            if(tata[a[nod][i]]==-1 && flux[nod][a[nod][i]]!=cap[nod][a[nod][i]])
            {
                tata[a[nod][i]]=nod;
                q.push(a[nod][i]);
            }
        }
    }
    if(tata[noduriD]==-1)
        return false;
    else
        return true;

}