Cod sursa(job #2424714)

Utilizator lucianminceaMincea Lucian lucianmincea Data 23 mai 2019 18:50:29
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <stdlib.h>

int ok;

int match(int **mat, int i, int m, int *st, int *dr, int *viz){
    int j;
    if (viz[i] == 1)
        return 0;
    viz[i] = 1;
    for (j = 1; j <= m; j++){
        if (mat[i][j] == 1 && st[j] == 0){
            st[j] = i;
            dr[i] = j;
            return 1;
        }
    }
    for (j = 1; j <= m; j++){
        if (mat[i][j] == 1 && match(mat, st[j], m, st, dr, viz) == 1){
            st[j] = i;
            dr[i] = j;
            return 1;
        }
    }
    return 0;
}

int main(){
    FILE *fin = fopen("cuplaj.in", "r");
    int n, m, e;
    fscanf(fin, "%d %d %d", &n, &m, &e);
    int **mat = (int**)calloc(n+1, sizeof(int*));
    int i;
    for (i = 1; i <= n; i++){
        mat[i] = (int*)calloc(m+1, sizeof(int));
    }
    int x, y;
    for (i = 0; i < e; i++){
        fscanf(fin, "%d %d", &x, &y);
        mat[x][y] = 1;
    }
    fclose(fin);

    int *st = (int*)calloc(n+1, sizeof(int));
    int *dr = (int*)calloc(m+1, sizeof(int));
    int *vizitat = (int*)calloc(n+1, sizeof(int));
    ok =1;

    while (ok){
        ok = 0;
        for (i = 1; i <= n; i++)
            vizitat[i] = 0;
        for (i = 1; i <= n; i++){
            if (dr[i] == 0)
                ok += match(mat, i, m, st, dr, vizitat);
        }
    }

    fin = fopen("cuplaj.out", "w");
    int cuplaj = 0;
    for (i = 1; i <= n; i++){
        if (dr[i])
            cuplaj++;
    }
    fprintf(fin, "%d\n",cuplaj);

    for (i = 1; i <= n; i++){
        if (dr[i])
            fprintf(fin, "%d %d\n", i, dr[i]);
    }

    free(dr);
    free(st);
    free(vizitat);
    for (i = 0; i <=n; i++)
        free(mat[i]);
    free(mat);
    fclose(fin);
    return 0;
}