Cod sursa(job #1582382)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 27 ianuarie 2016 21:19:03
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <cstring>
#define MAXN 255
#define MAXM 7000
int lista[MAXN+1], next[MAXM+1], val[MAXM+1], urm[MAXN+1], fata[MAXN+1], baiat[MAXN+1], ok[MAXN+1];
char viz[MAXN+1];
bool gasim(int x){
    if(viz[x]==1){
        return 0;
    }
    viz[x]=1;
    int p=lista[x];
    while(p){
        if(baiat[val[p]]==0){
            baiat[val[p]]=x;
            fata[x]=val[p];
            return 1;
        }
        p=next[p];
    }
    p=lista[x];
    while(p){
        if(gasim(baiat[val[p]])){
            baiat[val[p]]=x;
            fata[x]=val[p];
            return 1;
        }
        p=next[p];
    }
    return 0;
}
int main(){
    int n, m, i, x, f, ans, s;
    FILE *fin, *fout;
    fin=fopen("strazi.in", "r");
    fout=fopen("strazi.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=m; i++){
        fscanf(fin, "%d%d", &x, &val[i]);
        next[i]=lista[x];
        lista[x]=i;
    }
    f=1;
    while(f){
        f=0;
        memset(viz, 0, sizeof viz);
        for(i=1; i<=n; i++){
            if((!fata[i])&&(gasim(i))){
                f=1;
            }
        }
    }
    ans=n-1;
    for(i=1; i<=n; i++){
        if(fata[i]){
            ans--;
            ok[fata[i]]=1;
        }
    }
    fprintf(fout, "%d\n", ans);
    s=0;
    for(i=1; i<=n; i++){
        if(ok[i]==0){
            if(s!=0){
                fprintf(fout, "%d %d\n", s, i);
            }
            urm[s]=i;
            x=i;
            while(fata[x]){
                urm[x]=fata[x];
                x=fata[x];
            }
            s=x;
        }
    }
    s=0;
    while(urm[s]){
        s=urm[s];
        fprintf(fout, "%d ", s);
    }
    fclose(fin);
    fclose(fout);
    return 0;
    return 0;
}