Pagini recente » Profil byndrsn | Cod sursa (job #1983325) | Cod sursa (job #1851645) | Statistici FMI Mihai Bogdan (matzuu000) | Cod sursa (job #2424714)
#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;
}