Cod sursa(job #2274411)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 1 noiembrie 2018 19:17:58
Problema Felinare Scor 43
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<int> v[9010],u[9010];
int n,m,i,x,y,ans,D[9010],S[9010];
bitset<9010> viz;
bool acts[9010],actv[9010],vizz[9010][10],act[9010][10];

void dfs(int poz,int whic,int star)
{
    if(vizz[poz][whic])return ;
    vizz[poz][whic]=1;
    if(whic==star)
        act[poz][whic]=1;
    if(whic==0)
        for(auto it:v[poz])
            if(S[it])
                dfs(it,1,star);
            else;
    else
        for(auto it:u[poz])
            if(D[it])
                dfs(it,0,star);
    return;
}

bool grow(int i)
{
    if(viz[i])return 0;
    viz[i]=1;
    for(auto it:v[i])
        if(!S[it])
        {
            D[i]=it;
            S[it]=i;
            return 1;
        }
    for(auto it:v[i])
        if(!viz[S[it]]&&grow(S[it]))
        {
            D[i]=it;
            S[it]=i;
            return 1;
        }
    return 0;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        u[y].push_back(x);
    }
    for(bool ok=1;ok;)
    {
        ok=0;viz.reset();
        for(i=1;i<=n;i++)
            if(!D[i]&&grow(i))
            {
                ok=1;
                ans++;
            }
    }
    //for(i=1;i<=n;i++)
    //    cout<<D[i]<<' '<<S[i]<<'\n';
    for(i=1;i<=n;i++)
        if(!D[i])
            for(auto it:v[i])
                if(S[it])
                    dfs(it,1,1);
    for(i=1;i<=n;i++)
        if(!S[i])
            for(auto it:u[i])
                if(D[it])
                    dfs(it,0,0);
    for(i=1;i<=n;i++)
        if(D[i]&&(!vizz[i][0]))
            act[i][0]=1;
    g<<2*n-ans<<'\n';
    for(i=1;i<=n;i++)
        g<<(1-act[i][0])+2*(1-act[i][1])<<'\n';
    return 0;
}