Cod sursa(job #1902334)

Utilizator SkiryFarauanu Ionut Skiry Data 4 martie 2017 15:21:42
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,l,i,x,y,t[10001],s,d,viz[10001];
struct element
{
    int v,c,f;
};
element p;
vector <element> a[10001];
queue <int> q;
int bf()
{
    while(q.size()) q.pop();
    for(i=1;i<=d;i++) viz[i]=0;
    viz[1]=1;
    q.push(1);
    while(q.size())
    {
        int actual=q.front();

        q.pop();
        for(i=0;i<a[actual].size();i++)
            if(a[actual][i].c!=a[actual][i].f&&!viz[a[actual][i].v])
        {
            t[a[actual][i].v]=actual;
            viz[a[actual][i].v]=1;
            q.push(a[actual][i].v);
            if(a[actual][i].v==d) return 1;
        }
    }
    return 0;
}
int main()
{
    f>>n>>m>>l;
    for(i=1;i<=l;i++)
    {
        f>>x>>y;
        x++;
        y+=n+1;
        p.v=y;
        p.c=1;
        a[x].push_back(p);
        p.v=x;
        a[y].push_back(p);
    }
    s=1;
    d=n+m+2;
    for(i=2;i<=n+1;i++)
    {
        p.c=1;
        p.v=i;
        a[s].push_back(p);
        p.v=s;
        a[i].push_back(p);
    }
    for(i=n+2;i<d;i++)
    {
        p.c=1;
        p.v=i;
        a[d].push_back(p);
        p.v=d;
        a[i].push_back(p);
    }
    bf();//for(;bf();)
    {
        int sum=999999;
        for(i=d;i!=s;i=t[i])
        {
            for(int j=0;j<a[t[i]].size();j++)
                if(a[t[i]][j].v==i)
                    {sum=min(sum,a[t[i]][j].c-a[t[i]][j].f);continue;}
        }
        for(i=d;i!=s;i=t[i])
        {
            a[t[i]][i].f+=sum;
            a[i][t[i]].f-=sum;
        }
        g<<min(n,m)*sum;
    }
    return 0;
}