Pagini recente » Cod sursa (job #2271067) | Cod sursa (job #2625622) | Cod sursa (job #287656) | Cod sursa (job #615286) | Cod sursa (job #2737937)
#include <bits/stdc++.h>
using namespace std;
#define cin in
//#define cout out
#define run(n) for (int i = 1; i <= n; i++)
ifstream in("felinare.in");
ofstream out("felinare.out");
const int NMAX = 9200;
vector<int> plec[NMAX], ven[NMAX];
pair<int, int> fel[NMAX];
bitset<NMAX> parcurse;
int n, m, maxim = 1, rasp[NMAX];
void parcurge(int index) {
queue<int> coada;
for (coada.push(index); coada.size(); coada.pop()) {
unsigned int act = coada.front(), sosiri = 0;
if (plec[act].size()) {
for (int to : plec[act])
if (!fel[to].first)
if (ven[to].size() > sosiri)
sosiri = ven[to].size();
if (sosiri >= plec[act].size()) {
fel[act].second = 1;
sosiri = -1;
}
else {
fel[act].second = -1;
sosiri = 1;
}
for (int to : plec[act]) {
if (!fel[to].first) {
coada.push(to);
fel[to].first = sosiri;
parcurse[to] = 1;
}
}
}
else
fel[act].second = 1;
}
}
int main() {
cin >> n >> m;
while (m--) {
int a, b;
cin >> a >> b;
plec[a].push_back(b);
ven[b].push_back(a);
if (plec[a].size() > plec[maxim].size())
maxim = a;
}
run(n) {
if (plec[i].empty())
fel[i].second = 1;
if (ven[i].empty())
fel[i].first = 1;
}
parcurse[maxim] = 1;
parcurge(maxim);
maxim = 0;
run(n) {
fel[i].first = fel[i].first >= 0;
fel[i].second = fel[i].second >= 0;
maxim += fel[i].first + fel[i].second;
rasp[i] = fel[i].first * 2 + fel[i].second;
}
cout << maxim << '\n';
run(n)
cout << rasp[i] << '\n';
return 0;
}