Pagini recente » Cod sursa (job #1834400) | Cod sursa (job #390248) | Cod sursa (job #2653466) | Cod sursa (job #2180128) | Cod sursa (job #2897897)
#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 8;
vector <int> g[N + 5];
int h[N + 5];
void dfs(int u) {
if(h[u]) return;
for(int v : g[u]) {
if(!h[v]) dfs(v);
h[u] = max(h[u], h[v] + 1);
}
}
bool vis[N + 5];
vector <int> path;
vector <pair <int, int>> sol;
int getroot(int u) {
vis[u] = true;
path.push_back(u);
for(int v : g[u]) if(!vis[v])
return getroot(v);
return u;
}
int main()
{
ifstream cin("strazi.in");
ofstream cout("strazi.out");
int n, m;
priority_queue <pair <int, int>> pq;
cin >> n >> m;
for(int i = 1, u, v; i <= n; i++)
cin >> u >> v,
g[u].push_back(v);
for(int i = 1; i <= n; i++) {
dfs(i);
pq.emplace(h[i], i);
}
int v = 0;
while(!pq.empty()) {
auto [dist, u] = pq.top();
pq.pop();
if(vis[u]) continue;
if(v) sol.emplace_back(v, u);
v = getroot(u);
}
cout << sol.size() << "\n";
for(auto x : sol)
cout << x.first << " " << x.second << "\n";
for(int x : path)
cout << x << " ";
return 0;
}