Building a tree from edges

Hi everyone.

I’ve been looking for a solution the whole day but I can’t find an algorithm to solve the following.
In most of the problems refereed to “Trees” in Codechef the inputs are N-1 lines where each line has numbers U and V representing an edge. My question is, does anyone know an algorithm to build a tree only with the set of the edges?

Note. Look that when the numbers U V are given they don’t have an special order. (1,2) does not mean that 1 is the parent of 2 or viceversa.

Thank you very much

14 Likes

If it is undirected, there isn’t a special order. Because if 1 and 2 is connected with an edge, any one maybe anyone’s parent thinking of the perspective one wants to see the tree. Usually a root is given, just maintain this and start a dfs from the root. You don’t have to worry about order.

If it’s a directed tree, it’ll be given in the description how it is described in input.

3 Likes

Tree is a Graph, such that there is no cycle in it. So you can follow all the ways, one use to represent Graph:

1). Adjacency List(Most Preferable)

2). Adjacency Matrix.

Now How to built Tree only with set of edges ??.

→ Make Array A of Size N.[1…N]. Data Type of Array is : Pointer to LinkList.

DataMembers of LinkList:

if graph is weighted: int V, int Weight.

if graph is Unweighted: int V.

–>The LinkList Pointed by ith index of Array A represents all edges which has one of the endpoint as i.

→ Now for each edge U—V do:

A[U].add(V)
A[V].add(U)

–>This is called Adjacency List Representation of Graph.

For other ways to construct Graph please read :

Link : Implementation

1 Like

The trouble with those adjacency lists is that the queries are really slow… For example if I need to find the path between two nodes it takes O(N) time almost all of the times, instead of that, If I represent the undirected graph as a rooted tree, the worst case takes O(N) time and that’s only when the graph is a single path.

Well i dont know you want to perform queries on Nodes(as you have not mentioned that part in question):
I also get stuck at the same thing of answering Queries between nodes of tree and have already asked a question about it yesterday in Codechef: It will help you to start learning about how to answer those kind of queries in Least Time.

Question Link

3 Likes

For rooted trees, maintain an undirected graph, when you want to traverse, keep track of visited nodes. This way you won’t go back to a node’s parent.

Simple example case: Submission #52615031 - Codeforces

Though i suppose approach may also depend on problem’s logic.

1 Like

Can you please with an example code so that I can dry run it and understand this concept

People just make adjaceny list with the given input of graph and solve the question

Sometimes they perform DFS sometimes they don’t