Cod sursa(job #1202411)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 27 iunie 2014 22:30:33
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <bitset>
#include <vector>

#define NMAX 8205
using namespace std;

vector<int> graf[NMAX];
vector<int> graf_inv[NMAX];
bitset<NMAX> viz;
int st[NMAX];
int dr[NMAX];
int st_grad[NMAX];
int dr_grad[NMAX];

bool cupl(int nod)
{
    if(viz[nod])
        return 0;
    viz[nod]=1;

    for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
        if(!dr[*it]){
            st[nod]=*it;
            dr[*it]=nod;
            return 1;
        }

    for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
        if(cupl(dr[*it])){
            st[nod]=*it;
            dr[*it]=nod;
            return 1;
        }

    return 0;
}

int main()
{
    ifstream cin("felinare.in");
    ofstream cout("felinare.out");

    int n=0,m=0,a,b;
    cin>>n>>m;

    while(m--){
        cin>>a>>b;
        graf[a].push_back(b);
        graf_inv[b].push_back(a);
    }

    bool ok=true;
    while(ok){
        ok=false;
        viz&=0;

        for(int i=1;i<=n;i++)
            if(!st[i] && cupl(i))
                ok=true;
    }

    int cuplaj=0;
    for(int i=1;i<=n;i++)
        if(st[i])
            cuplaj++;

    for(int i=1;i<=n;i++)
        if(st[i])
            for(vector<int>::iterator it=graf[i].begin();it!=graf[i].end();it++)
                if(!dr[*it])
                    st_grad[i]++;

    for(int i=1;i<=n;i++)
        if(dr[i])
            for(vector<int>::iterator it=graf_inv[i].begin();it!=graf_inv[i].end();it++)
                if(!st[*it])
                    dr_grad[i]++;


    for(int i=1;i<=n;i++)
        if(st[i]){
            int vec=st[i];
            if(st_grad[i])
                st[i]=1,dr[vec]=0;
            else if(dr_grad[i])
                dr[vec]=1,st[i]=0;
            else
                st[i]=1,dr[vec]=0;
        }

    cout<<2*n-cuplaj<<'\n';
    for(int i=1;i<=n;i++){
        st[i]=1-st[i];
        dr[i]=1-dr[i];

        cout<<((st[i]<<1)+dr[i])<<'\n';
    }

    cin.close();
    cout.close();
    return 0;
}