Cod sursa(job #994149)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 4 septembrie 2013 23:50:53
Problema Felinare Scor 43
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
//#include <iostream>
#include <fstream>
using namespace std;

ifstream f("felinare.in");
ofstream g("felinare.out");

#define LE 60666
#include <vector>
#define pb push_back
#define cin f
#define cout g


bool viz[LE],still,stare[LE];
int result[LE],cuplaj[LE],n,m,i,j;
vector<int> H[LE];


bool pair_up(int nod) {
    int N=H[nod].size(),i;
    viz[nod]=true;

    for(i=0; i<N; ++i)
        if (viz[H[nod][i]]==false) {
            viz[H[nod][i]]=true;

            if (!cuplaj[H[nod][i]]) {
                cuplaj[H[nod][i]]=nod;
                cuplaj[nod]=H[nod][i];
                return true;
            } else if (viz[cuplaj[H[nod][i]]]==false) {
                if (pair_up(cuplaj[H[nod][i]])) {
                    cuplaj[H[nod][i]]=nod;
                    cuplaj[nod]=H[nod][i];
                    return true;
                }
            }
        }

    return false;
}

void dfs(int nod,int state) {
    stare[nod]=state;
    int i,N=H[nod].size();
    viz[nod]=true;

    for(i=0; i<N; ++i)
        if (viz[H[nod][i]]==false)
            dfs(H[nod][i],!state);
}

int main() {

    f>>n>>m;

    for(i=1; i<=m; ++i) {
        int xx,yy;
        f>>xx>>yy;
        H[xx].pb(yy+n);
        H[yy+n].pb(xx);
    }

    int nr_result=0;
    still=true;

    while (still) {
        still=false;
        for(i=1; i<=n+n; ++i) viz[i]=false;

        for(i=1; i<=n; ++i)
            if (viz[i]==false&&cuplaj[i]==0) {
                bool res=pair_up(i);
                still|=res;
                if (res) ++nr_result;
            }
    }

    cout<<2*n-nr_result<<'\n';

    for(i=1; i<=n+n; ++i) viz[i]=false;

    for(i=1; i<=n+n; ++i)
        if (cuplaj[i]==0) stare[i]=true;

    for(i=1; i<=n+n; ++i)
        if (stare[i]==true&&viz[i]==false)
            dfs(i,true);

    for(i=1; i<=n; ++i)
        if (stare[i]==true) result[i]++;

    for(i=n+1; i<=n+n; ++i)
        if (stare[i]==true) result[i-n]+=2;

    for(i=1; i<=n; ++i)
        if (stare[i]==false&&cuplaj[i]&&stare[cuplaj[i]]==false) {
            int N=H[i].size();
            bool okz=false;

            for(int j=0;j<N;++j)
              if (stare[H[i][j]]==true)
                okz=true;

            if (okz==false) result[i]++;
            else result[cuplaj[i]-n]+=2;
        }

    for(i=1; i<=n; ++i) cout<<result[i]<<'\n';

    f.close();
    g.close();
    return 0;
}