Cod sursa(job #2424705)

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

int ok;

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

int min(int a, int b){
    if (a > b)
        return b;
    else return a;
}

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 = 0; i < n+1; i++){
        mat[i] = (int*)calloc(m+1, sizeof(int));
    }
    int x, y, j;
    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, n, 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]);
    }
    fclose(fin);
    return 0;
}