Cod sursa(job #1605218)

Utilizator AeroHHorea Stefan AeroH Data 18 februarie 2016 20:45:19
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#define ll long long int
#define N 8192
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");

ll n,m,i,j,k,x,y,p,ip,rasp,ok,a,b,c,ur,ce,dp[N][4];

vector<int> v[N],w[N];
vector<pair<int,pair<int,int> > > si;
bitset<N*N> mark;

void doit(vector<int> v,int nod,int t)
{
     for (j=0;j<v.size();++j)
            {
                ur = v[j];
                ce = nod*N+ur ;
                if (mark[ce])
                    break;
            }
            if (j == v.size())
            {
                for (j=0;j<v.size();++j)
                    {
                        ur = v[j];
                        ce = nod*N+ur ;
                        mark[ce] = 1;
                        ce = nod + ur*N;
                        mark[ce] = 1;
                    }
                dp[nod][t]=1;
            }
}

int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
    f>>x>>y;
    v[x].push_back(y);
    w[y].push_back(x);
}
for(i=1;i<=n;++i)
si.push_back({v[i].size(),{i,1}}),
si.push_back({w[i].size(),{i,2}});

sort(si.begin(),si.end());
for (i=0;i<si.size();++i)
{
    a=si[i].first;
    b=si[i].second.first;
    c=si[i].second.second;
    if (c==1)
        {
            doit(v[b],b,c);
        }
    else doit(w[b],b,c);
}

int r=0;
for(i=1;i<=n;++i)
{
    if (dp[i][1] && dp[i][2])
        dp[i][0]=3,r+=2;
    else if (dp[i][1])
        dp[i][0]=1,r+=1;
    else if (dp[i][2])
        dp[i][0]=2,r+=1;

}

g<<r<<'\n';
for (i=1;i<=n;++i)
    g<<dp[i][0]<<'\n';

return 0;
}