Cod sursa(job #1710944)

Utilizator teodorauTeodora Untaru teodorau Data 30 mai 2016 06:53:23
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <int> graph[10001];
bool visited[10001], ok=true;
int stanga[10001], dreapta[10001];;

bool cuplaj (int x)
{
    if (visited[x])
        return false;
    visited[x]=true;
    for (int i=0;i<graph[x].size();i++)
    {
        int y=graph[x][i];
        if (!dreapta[y])
        {
            stanga[x]=y;
            dreapta[y]=x;
            return true;
        }
        if (cuplaj(dreapta[y]))
        {
            stanga[x]=y;
            dreapta[y]=x;
            return true;
        }
    }
    return false;
}

int main()
{
    int n,m,e,i,x,y,nr=0;
    f>>n>>m>>e;
//    graph.resize(n);
    for (i=0;i<e;i++)
        {
            f>>x>>y;
            graph[x].push_back(y);
        }
    while(ok)
    {
        memset(visited,0,sizeof(visited));
        ok=0;
        for (i=1;i<=n;i++)
            if (!stanga[i])
                if (cuplaj(i))
                    ok=true;
    }
    for (i=1;i<=n;i++)
        if (stanga[i])
            nr++;
    g<<nr<<endl;
    for (i=1;i<=n;i++)
        if (stanga[i])
            g<<i<<" "<<stanga[i]<<endl;

    return 0;
}