Cod sursa(job #2470330)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 9 octombrie 2019 00:35:37
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
struct node{
    int grad,nod,tip;
    bool operator< (const node& other) const{
        if(grad!=other.grad)
            return grad>other.grad;
        if(nod!=other.nod)
            return nod<other.nod;
        return tip<other.tip;
    }
    node(int x, int z, int y){
        grad=x, tip=y, nod=z;
    }
    node(){
        grad=tip=nod=0;
    }
};
const int NMAX=9e3;

int n,grad[NMAX][3],ans;
short sol[NMAX];
vector <int> g[NMAX],gt[NMAX];
set <node> pq;

int main(){
    int i,m,x,y;
    fin>>n>>m;
    for(i=0;i<m;++i){
        fin>>x>>y;
        g[x].push_back(y);
        gt[y].push_back(x);
        ++grad[x][1];
        ++grad[y][2];
    }
    for(i=1;i<=n;++i){
        sol[i]=3;
        if(grad[i][1])
            pq.insert(node(grad[i][1], i, 1));
        if(grad[i][2])
            pq.insert(node(grad[i][2], i, 2));
    }
    ans=2*n;
    while(!pq.empty()){
        x=(*(pq.begin())).nod;
        y=(*(pq.begin())).tip;
        pq.erase(pq.begin());
        if(!grad[x][y])
            break;
        sol[x]-=y;
        --ans;
        if(y == 1){
            for(auto it:g[x]){
                pq.erase(pq.find(node(grad[it][2],it,2)));
                --grad[it][2];
                if(grad[it][2])
                    pq.insert(node(grad[it][2],it,2));
            }
        }else{
            for(auto it:gt[x]){
                pq.erase(pq.find(node(grad[it][1],it,1)));
                --grad[it][1];
                if(grad[it][1])
                    pq.insert(node(grad[it][1],it,1));
            }
        }
    }
    fout<<ans<<'\n';
    for(i=1;i<=n;++i)
        fout<<sol[i]<<' ';
    return 0;
}