Cod sursa(job #930587)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 27 martie 2013 18:47:43
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define INF 2000000000
struct nod
{
    int nr;
    nod *next;
}*First[5005];
int N,M,E,S,F,Flow;
int Cap[5005][5005];
int Cost[5005][5005],T[5005];
void Insert(int x,int y)
{
    nod *q=new nod;
    q->nr=y;
    q->next=First[x];
    First[x]=q;
}
void Read()
{
    ifstream fin("cuplaj.in");
    fin>>N>>M>>E;
    int i,x,y,y2;
    S=N+M+1;
    F=S+1;
    for(i=1;i<=E;i++)
    {
        fin>>x>>y;
        y2=y+N;
        Cap[x][y2]=1;
        Insert(x,y2);
        Insert(y2,x);
    }
    for(i=1;i<=N;i++)
    {
        Cap[S][i]=1;
        Insert(S,i);
        Insert(i,S);
    }
    for(i=N+1;i<=N+M;i++)
    {
        Cap[i][F]=1;
        Insert(F,i);
        Insert(i,F);
    }
    fin.close();
}
int Road()
{
    int c[E+5],cur,p,u,i;
    memset(T,-1,sizeof(T));
    T[S]=0;
    p=u=1;
    c[p]=S;
    nod *q;
    for(;p<=u;p++)
    {
        cur=c[p];
        for(q=First[cur];q;q=q->next)
        {
            i=q->nr;
            if(Cap[cur][i]-Cost[cur][i]>0&&T[i]==-1)
            {
                T[i]=cur;
                u++;
                c[u]=i;
                if(i==F)
                    return 1;
            }
        }
    }
    return 0;
}
void Solve(int k,int &min)
{
    if(T[k]!=0)
    {
        if(Cap[T[k]][k]-Cost[T[k]][k]<min&&Cap[T[k]][k]-Cost[T[k]][k]>0)
        {
            min=Cap[T[k]][k]-Cost[T[k]][k];
        }
        Solve(T[k],min);
        Cost[T[k]][k]+=min;
        Cost[k][T[k]]-=min;
    }
}
int Resolve()
{
    int sw=Road(),min,flow=0;
    while(sw)
    {
         min=INF;
         Solve(F,min);
         flow+=min;
         sw=Road();
    }
    return flow;
}
void write(int t[10005][10005])
{
    int i,j;
    for(i=1;i<=F;i++)
    {
        for(j=1;j<=F;j++)
            printf("%d ",t[i][j]);
        printf("\n");
    }
}
void Write()
{
    ofstream fout("cuplaj.out");
    int i,j;
    fout<<Flow<<'\n';
    for(i=1;i<=N&&Flow>0;i++)
    {
        for(j=N+1;j<S;j++)
        {
            if(Cost[i][j]==1)
            {
                fout<<i<<' '<<j-N<<'\n';
                Flow--;
                break;
            }
        }
    }
    fout.close();
}
int main()
{
    Read();
    Flow=Resolve();
    Write();
    return 0;
}