Cod sursa(job #2018924)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 6 septembrie 2017 13:26:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define MAX 10001
using namespace std;

FILE *f1 = fopen("cuplaj.in", "r");
FILE *f2 = fopen("cuplaj.out", "w");

int n, m, e, i, j, cupl = 0, sw, a, b, st[MAX], dr[MAX], v[MAX];
vector<int> G[MAX];

int cuplaj(int node)
{
    int i;
    if (v[node] == 1)
        return 0;
    v[node] = 1;
    for (i = 0; i < G[node].size(); i++)
        if (dr[G[node][i]] == 0)
        {
            dr[G[node][i]] = node;
            st[node] = G[node][i];
            return 1;
        }

    for (i = 0; i < G[node].size(); i++)
        if (cuplaj(dr[G[node][i]]) == 1)
        {
            dr[G[node][i]] = node;
            st[node] = G[node][i];
            return 1;
        }
    return 0;
}

int main()
{
    fscanf(f1, "%d%d%d", &n, &m, &e);
    for (i = 1; i <= e; i++)
    {
        fscanf(f1, "%d%d", &a, &b);
        G[a].push_back(b);
    }

    sw = 1;
    while(sw == 1)
    {
        sw = 0;
        memset(v, 0, sizeof(v));
        for (i = 1; i <= n; i++)
            if (st[i] == 0 && cuplaj(i) == 1)
            {
                sw = 1;
                cupl++;
            }
    }

    fprintf(f2, "%d\n", cupl);
    for (i = 1; i <= n; i++)
        if (st[i] != 0)
        fprintf(f2, "%d %d\n", i, st[i]);

    fclose(f1);
    fclose(f2);
    return 0;
}