Pagini recente » Cod sursa (job #247738) | Cod sursa (job #618887) | Cod sursa (job #1850141) | Cod sursa (job #1490898) | Cod sursa (job #2897893)
#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);
if(!g[u].size()) return u;
for(int v : g[u]) if(!vis[v])
return getroot(v);
}
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;
}