Pagini recente » Cod sursa (job #1345171) | Cod sursa (job #436382) | Cod sursa (job #1396861) | Cod sursa (job #2707794) | Cod sursa (job #2724035)
#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';
}