Cod sursa(job #2280287)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 10 noiembrie 2018 13:26:34
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;
#define inf INT_MAX

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,i,j,t,m,e,pu[11000],pv[11000],d[21000];
vector<int> l[11000];

bool bfs()
{
    queue<int> q;
    for (int u=1;u<=n;u++)
    {
        if (pu[u]==0)
        {
            d[u]=0;
            q.push(u);
        }
        else d[u]=inf;
    }
    d[0]=inf;
    while (!q.empty())
    {
        int u=q.front();
        q.pop();
        if (d[u]<d[0])
          for (int i=1;i<l[u].size();i++)
          {
              int v=l[u][i];
              if (d[pv[v]]==inf)
              {
                  d[pv[v]]=d[u]+1;
                  q.push(pv[v]);
              }
          }
    }
    return d[0]!=inf;
}

bool dfs(int u)
{
    if (u!=0)
    {
        for (int i=1;i<l[u].size();i++)
        {
            int v=l[u][i];
            if (d[pv[v]]==d[u]+1)
            if (dfs(pv[v]))
            {
                pv[v]=u;
                pu[u]=v;
                return 1;
            }
        }
        d[u]=inf;
        return 0;
    }
    return 1;
}

int main()
{
    fin>>n>>m>>e;
    for (i=1;i<=n;i++) l[i].push_back(0);
    for (i=1;i<=e;i++)
    {
        int x,y;
        fin>>x>>y;
        l[x].push_back(y);
    }

    int rs=0;
    while (bfs())
    {
        for (int u=1;u<=n;u++)
            if (pu[u]==0 && dfs(u))
              rs++;
    }
    fout<<rs;
    return 0;
}