Povezan graf koji sadrži \(n\) čvorova i \(n-1\) grana se naziva drvo. Svaki čvor drveta može biti njegov koren. Napiši program koji za dato drvo i dati koren određuje smer svih grana u tom korenskom drvetu.
Sa standardnog ulaza se unosi broj čvorova \(n\) (\(1 \leq n \leq 10^5\)), a zatim i opis \(n-1\) grana drveta. Svaka grana je određena brojevima polaznog i završnog čvora (celi brojevi između \(0\) i \(n-1\)), pri čemu su oni zadati u proizvoljnom redosledu. U poslednjem redu se nalazi redni broj korena (broj između \(0\) i \(n-1\)).
Na standardni izlaz treba ispisati grane rezultujućeg korenskog drveta, pri čemu svaka grana treba da bude orijentisana u smeru od korena ka listovima. Niz svih grana (parova brojeva) treba da bude leksikografski sortiran (grane se porede prvo po prvom, a zatim po drugom čvoru).
5 1 0 2 4 3 4 4 1 4
1 0 4 1 4 2 4 3
5 1 0 2 4 3 4 4 1 2
1 0 2 4 4 1 4 3
Zadatak se može jednostavno rešiti tako što se pokrene algoritam pretrage u dubinu krenuvši od početnog čvora. Svaka pretraga u dubinu povezanog grafa implicitno generiše jedno korensko drvo (gde su grane određene prelazima sa čvora na njegove neposećene susede) i u našem zadatku to je upravo drvo koje je potrebno generisati.
#include <iostream>
#include <vector>
#include <utility>
#include <stack>
#include <algorithm>
using namespace std;
class Graph {
private:
int number_of_nodes;
<vector<int>> neighbours_list;
vector<bool> visited;
vector
public:
(int number_of_nodes) {
Graphthis->number_of_nodes = number_of_nodes;
.resize(number_of_nodes, false);
visited}
void add_edge(int u, int v) {
[u].push_back(v);
neighbours_list[v].push_back(u);
neighbours_list}
<pair<int, int>> create_tree(int root) {
vector<pair<int, int>> edges;
vector.reserve(number_of_nodes - 1);
edges
<int> s;
stack.push(root);
s[root] = true;
visited
int current;
while (!s.empty()) {
= s.top();
current .pop();
s
for (int neighbour : neighbours_list[current])
if (!visited[neighbour]) {
.push(neighbour);
s[neighbour] = true;
visited.emplace_back(current, neighbour);
edges}
}
(begin(edges), end(edges));
sortreturn edges;
}
};
int main() {
int number_of_nodes;
>> number_of_nodes;
cin
*G = new Graph(number_of_nodes);
Graph
int u, v;
for (int i = 0; i < number_of_nodes - 1; i++) {
>> u >> v;
cin ->add_edge(u, v);
G}
int root;
>> root;
cin
<pair<int, int>> edges = G->create_tree(root);
vectorfor (const auto &p : edges) {
<< p.first << " " << p.second << "\n";
cout }
delete G;
return 0;
}