Cod sursa(job #2518928)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 6 ianuarie 2020 19:14:38
Problema Felinare Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("felinare.in");
ofstream fout("felinare.out");

const int NMAX = 8191;
const int MMAX = 20000;

struct ev
{
    int val, ind, tip;

    bool operator < (const ev other) const
    {
        return val < other.val;
    }
};

int N, M;

int inDeg[NMAX + 5], outDeg[NMAX + 5];

vector <int> inEdges[NMAX + 5];
vector <int> outEdges[NMAX + 5];

bool visEdge[MMAX + 5];

vector <ev> v;

int ans;
bool f[NMAX + 5], s[NMAX + 5];

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= M; i++)
    {
        int x, y;
        fin >> x >> y;

        outDeg[x]++, inDeg[y]++;

        outEdges[x].push_back(i);
        inEdges[y].push_back(i);
    }

    for(int i = 1; i <= N; i++)
    {
        v.push_back({inDeg[i], i, 1});
        v.push_back({outDeg[i], i, 0});
    }

    sort(v.begin(), v.end());

    for(auto it : v)
        if(it.val == 0)
        {
            if(it.tip == 1)
                f[it.ind] = 1;
            else
                s[it.ind] = 1;

            ans++;
        }
        else
        {
            if(it.tip == 1)
            {
                bool ok = true;

                for(auto in : inEdges[it.ind])
                    if(visEdge[in] == 1)
                    {
                        ok = false;
                        break;
                    }

                if(ok == true)
                {
                    ans++;

                    for(auto in : inEdges[it.ind])
                        visEdge[in] = true;

                    f[it.ind] = 1;
                }
            }
            else
            {
                bool ok = true;

                for(auto out : outEdges[it.ind])
                    if(visEdge[out] == 1)
                    {
                        ok = false;
                        break;
                    }

                if(ok == true)
                {
                    ans++;

                    for(auto out : outEdges[it.ind])
                        visEdge[out] = true;

                    s[it.ind] = 1;
                }
            }
        }

    fout << ans << '\n';

    for(int i = 1; i <= N; i++)
    {
        if(f[i] == 0 && s[i] == 0)
            fout << 0 << '\n';
        else if(f[i] == 1 && s[i] == 0)
            fout << 2 << '\n';
        else if(f[i] == 0 && s[i] == 1)
            fout << 1 << '\n';
        else
            fout << 3 << '\n';
    }

    return 0;
}