Cod sursa(job #2471021)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 10 octombrie 2019 06:49:42
Problema Felinare Scor 43
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
const int NMAX=8200;

int n,ans;
int l[NMAX], r[NMAX],sol;
bool st[NMAX],dr[NMAX];
bool used[NMAX];
vector <int> g[NMAX];

bool dfs(int);
bool support(int);

int main(){
    int i,m,x,y,ok=1;
    fin>>n>>m;
    for(i=0;i<m;++i){
        fin>>x>>y;
        g[x].push_back(y);

    }
    while(ok){
        ok=0;
        memset(used,0,sizeof used);
        for(i=1;i<=n;++i){
            if(!used[i] && !l[i])
                ok+=dfs(i);
        }
        sol+=ok;
    }
    memset(used, 0, sizeof used);
    for(i=1;i<=n;++i){
        if(!l[i] && !used[i])
            support(i);
    }
    fout<<2*n-sol<<'\n';
    for(i=1;i<=n;++i){
        sol=3;
        if(!st[i])
            sol-=1;
        if(dr[i])
            sol-=2;
        fout<<sol<<'\n';
    }
    return 0;
}
bool support(int node){
    used[node]=1;
    st[node]=1;
    for(auto it:g[node]){
        if(!used[it]){
            dr[it]=1;
            if(r[it] && !used[r[it]])
                support(r[it]);
        }
    }
}
bool dfs(int node){
    used[node]=1;
    for(auto it:g[node]){
        if(!r[it] || (!used[r[it]] && dfs(r[it]))){
            l[node]=it;
            r[it]=node;
            return 1;
        }
    }
    return 0;
}