Pagini recente » Cod sursa (job #2547961) | Cod sursa (job #2737778)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 8200;
vector<int> road[N], backward[N];
vector<pair<int, int>> order;
int n, m, grad[2][N], done[2][N], open[2][N], x, y, total;
ifstream cin("felinare.in");
ofstream cout("felinare.out");
int main() {
cin >> n >> m;
while (m--) {
cin >> x >> y;
road[x].push_back(y);
backward[y].push_back(x);
grad[0][x]++;
grad[1][y]++;
}
for (int i = 1; i <= n; i++) {
order.push_back({grad[0][i], i});
order.push_back({grad[1][i], -i});
}
sort(order.begin(), order.end());
for (auto who : order) {
int cgrad = 0, cnod = abs(who.second);
if (who.second < 0)
cgrad = 1;
if (done[cgrad][cnod])
continue;
total++;
open[cgrad][cnod] = 1;
if (cgrad == 0) {
for (auto next : road[cnod])
done[cgrad ^ 1][next] = 1;
} else {
for (auto next : backward[cnod])
done[cgrad ^ 1][next] = 1;
}
}
cout << total << "\n";
for (int i = 1; i <= n; i++) {
if (open[0][i] && open[1][i])
cout << "3\n";
else if (open[0][i])
cout << "1\n";
else if (open[1][i])
cout << "2\n";
else
cout << "0\n";
}
}