Cod sursa(job #1974174)

Utilizator butiricristianButiri Cristian butiricristian Data 27 aprilie 2017 00:00:56
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <string.h>
 
#define pb push_back
#define MAX 10010
 
using namespace std;
 
int nrSour, nrDest, nrEdges, sol;
int vctDr[MAX], vctSt[MAX], sel[MAX];
vector <int> listDrum[MAX];
 
int cupleaza(int nod)
{
    if (sel[nod])
        return 0;
 
    sel[nod] = 0;
 
    for (int i = 0; i < listDrum[nod].size(); i++)
        if (!vctSt[listDrum[nod][i]] || cupleaza(vctSt[listDrum[nod][i]]))
        {
            vctSt[listDrum[nod][i]] = nod;
            vctDr[nod] = listDrum[nod][i];
 
            return 1;
        }
 
    return 0;
}
 
 
int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
 
    scanf("%d %d %d", &nrSour, &nrDest, &nrEdges);
 
    for (; nrEdges; nrEdges--)
    {
        int t, f;
        scanf("%d %d", &t, &f);
 
        listDrum[t].pb(f);
    }
 
    for (int ok = 1, i; ok; memset(sel, 0, sizeof(sel)))
        for (i = 1, ok = 0; i <= nrSour; i++)
            if (!vctDr[i])
                ok |= cupleaza(i);
 
    for (int i = 1; i <= nrSour; i++)
        if (vctDr[i])
            sol++;
 
    printf("%d\n", sol);
 
    for (int i = 1; i <= nrSour; i++)
        if (vctDr[i])
            printf("%d %d\n", i, vctDr[i]);
 
    fclose(stdin);
    fclose(stdout);
    return 0;