Cod sursa(job #2772582)

Utilizator Raresr14Rosca Rares Raresr14 Data 1 septembrie 2021 18:39:04
Problema Felinare Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n,m,i,R[9000],L[9000],x,y,sol,ok,U[9000],D[9000];
vector<int> A[9000];
bitset<9000> f;
int cuplaj(int nod){
    if(f[nod])
        return 0;
    f[nod]=1;
    for(int i=0;i<A[nod].size();i++){
        int vec=A[nod][i];
        if(!R[vec]){
            R[vec]=nod;
            L[nod]=vec;
            sol++;
            return 1;
        }
    }
    for(int i=0;i<A[nod].size();i++){
        int vec=A[nod][i];
        if(cuplaj(R[vec])){
            R[vec]=nod;
            L[nod]=vec;
            return 1;
        }
    }
    return 0;
}
void cover(int nod){
    for(int i=0;i<A[nod].size();i++){
        int vec=A[nod][i];
        if(!D[vec]){
            D[vec]=1;
            U[R[vec]]=0;
            cover(R[vec]);
        }
    }
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        A[x].push_back(y);
    }
    do{
        ok=0;
        f.reset();
        for(i=1;i<=n;i++)
            if(!L[i])
                ok|=cuplaj(i);
    }while(ok);
    fout<<2*n-sol<<"\n";
    for(i=1;i<=n;i++)
        if(!L[i])
            cover(i);
        else
            U[i]=1;
    for(i=1;i<=n;i++){
        if(!U[i]&&!D[i])
            fout<<"3\n";
        if(U[i]&&!D[i])
            fout<<"2\n";
        if(!U[i]&&D[i])
            fout<<"1\n";
        if(U[i]&&D[i])
            fout<<"0\n";
    }
    return 0;
}