Cod sursa(job #2017625)

Utilizator cipri321Marin Ciprian cipri321 Data 1 septembrie 2017 22:28:18
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 10001
#define INF 1000000000
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n,m,e;
vector<int> V[DIM];
int S[DIM],D[DIM];
int rez;
int VIZ[DIM];
queue<int> Q;
bool dfs(int v)
{
    if(v!=0)
    {
        for(int i=0;i<V[v].size();i++)
        {
            int to=V[v][i];
            if(VIZ[D[to]]==VIZ[v]+1)
                if(dfs[D[to]])
                {
                    S[v]=to;
                    D[to]=v;
                    return true;
                }
        }
        VIZ[v]=INF;
        return false;
    }
    return true;
}
bool bfs()
{
    for(int i=1;i<=n;i++)
        if(S[i]==0)
        {
            VIZ[i]=0;
            Q.push(i);
        }
        else
            VIZ[i]=INF;
    VIZ[0]=INF;
    while(!Q.empty())
    {
        int v=Q.front();
        Q.pop();
        if(VIZ[v]<VIZ[0])
            for(int i=0;i<V[v].size();i++)
            {
                int to=V[v][i];
                if(VIZ[D[to]]==INF)
                {
                    Q.push(D[to]);
                    VIZ[D[to]]=VIZ[v]+1;
                }
            }
    }
    return VIZ[0]!=INF;
}
int main()
{
    fi>>n>>m>>e;
    for(int i=1;i<=e;i++)
    {
        int a,b;
        fi>>a>>b;
        V[a].push_back(b);
    }
    while(bfs())
    {
        for(int i=1;i<=n;i++)
            if(S[i]==0&&dfs(i))
                rez++;
    }
    fo<<rez<<"\n";
    for(int i=1;i<=n;i++)
        if(S[i])
            fo<<i<<" "<<S[i]<<"\n";
    fi.close();
    fo.close();
    return 0;
}