Pagini recente » Cod sursa (job #168583) | Cod sursa (job #819376) | Cod sursa (job #826844) | Cod sursa (job #902261) | Cod sursa (job #2470334)
#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=8200;
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;
}