Cod sursa(job #1404362)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 28 martie 2015 01:27:39
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 10003
using namespace std;
FILE *fo=fopen("cuplaj.in","r"),*g=fopen("cuplaj.out","w");
vector <int> l[nmax],r1,r2;
int t[nmax],f[nmax][nmax],c[nmax][nmax],n,m,flux,s,d;
int bf()
{
    queue <int> q;
    int i,j,x,ok=0;
    for(i=1;i<=n+m+2;i++)
        t[i]=0;
    t[s]=-1;
    q.push(s);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(i=0;i<l[x].size();i++)
        {
            j=l[x][i];
            if(t[j]==0&&f[x][j]<c[x][j])
            {
                if(j!=d)
                {
                    t[j]=x;
                    q.push(j);
                }
                else
                    ok=1;
            }
        }
    }
    return ok;
}
void dinic()
{
    int i,j,x,pas,mini;
    for(pas=bf();pas>0;pas=bf())
    {
        for(i=0;i<l[d].size();i++)
        {
            j=l[d][i];
            if(t[j]>0&&c[j][d]>f[j][d])
            {
                t[d]=j;
                mini=5;
                for(x=d;x!=s;x=t[x])
                    if(mini>c[t[x]][x]-f[t[x]][x])
                       mini=c[t[x]][x]-f[t[x]][x];
                if(mini>0)
                {
                    r1.push_back(t[j]);
                    r2.push_back(j);
                    flux+=mini;
                    for(x=d;x!=s;x=t[x])
                    {
                        f[t[x]][x]+=mini;
                        f[x][t[x]]-=mini;
                    }
                    }
            }
        }
    }
}
int main()
{
    int i,j,x,y,e;

    fscanf(fo,"%d %d %d",&n,&m,&e);
    s=n+m+1; d=n+m+2;
    for(i=1;i<=e;i++)
    {
        fscanf(fo,"%d %d",&x,&y);
        y=y+n;
        l[x].push_back(y);
        c[x][y]=1;
    }
    for(i=1;i<=n;i++)
    {
        l[s].push_back(i);
        c[s][i]=1;
    }
    for(i=n+1;i<=n+m;i++)
    {
        l[i].push_back(d);
        l[d].push_back(i);
        c[i][d]=1;
    }
    dinic();
    fprintf(g,"%d\n",flux);
    for(i=0;i<r1.size();i++)
        fprintf(g,"%d %d\n",r1[i],r2[i]-n);
    return 0;
}