Cod sursa(job #2724035)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 16 martie 2021 11:44:06
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, din[10000], dout[10000], ans[10000];
vector<int> g[10000], gt[10000];

int main() {
    fin >> n >> m;
    while(m--) {
        int u, v;
        fin >> u >> v;
        g[u].push_back(v);
        gt[v].push_back(u);
        dout[u]++;
        din[v]++;
    }
    set<pair<pair<int, int>, int> > st;

    for(int i = 1; i <= n; i++) {
        st.insert({{dout[i], 1}, i});
        st.insert({{din[i], 2}, i});
    }

    int nr = 0;
    for(int i = 1; i <= 2*n; i++) {
        int node = 0, t = 0, deg = 1e9;
        for(int j = 1; j <= n; j++) {
            if((!st.count({{dout[j], 1}, j})) || ans[j]%2) continue;
            if(dout[j] < deg) {
                deg = dout[j];
                node = j;
                t = 1;
            }
        }
        for(int j = 1; j <= n; j++) {
            if((!st.count({{din[j], 2}, j})) || ans[j]/2) continue;
            if(din[j] < deg) {
                deg = din[j];
                node = j;
                t = 2;
            }
        }
        if(node == 0) break;
        cout << node << ' ' << t << ' ' << deg << '\n';

        bool ok = true;
        if(t == 1) {
            for(auto next: g[node])
                if(ans[next]/2)
                    ok = false;
            if(ok) {
                ans[node] += t;
                nr++;
                for(auto next: g[node]) {
                    st.erase({{din[next], 2}, next});
                    for(auto next2: gt[next]) {
                        if(st.count({{dout[next2], 1}, next2})) {
                            st.erase({{dout[next2], 1}, next2});
                            dout[next2]--;
                            st.insert({{dout[next2], 1}, next2});
                        }
                    }
                }
            }
        } else {
            for(auto next: gt[node])
                if(ans[next]%2)
                    ok = false;
            if(ok) {
                ans[node] += t;
                nr++;
                for(auto next: gt[node]) {
                    st.erase({{dout[next], 1}, next});
                    for(auto next2: g[next]) {
                        if(st.count({{din[next2], 2}, next2})) {
                            st.erase({{din[next2], 2}, next2});
                            din[next2]--;
                            st.insert({{din[next2], 2}, next2});
                        }
                    }
                }
            }
        }
    }
    fout << nr << '\n';
    for(int i = 1; i <= n; i++)
        fout << ans[i] << '\n';
}