Convert the undirected graph into directed graph such that there is no path of length greater than 1 - GeeksforGeeks

09 May, 2022
Given an undirected graph with N vertices and M edges and no self loops or multiple edges. The task is to convert the given undirected graph into a directed graph such that there is no path of length greater than 1. If it is possible to make such a graph then print two space-separated integers u and v in M lines where u, v denotes source and destination vertices respectively. If not possible then print -1. Examples:
Input:  Output: 1 2 1 3 1 4  Input:  Output: -1 For the given graph it is not possible to get a directed graph such that there is no path of length greater than 1
Approach: Let suppose the graph contains a cycle of odd length. It means that some two consecutive edges of this cycle will be oriented in the same way and will form a path of length two. Then the answer is -1. And if the graph contains no cycles of odd length. Then it is bipartite. Let’s color it and see what we got. We got some vertices in the left part, some vertices in the right part and all edges connecting vertices from different parts. Let’s orient all edges such that they will go from the left part to the right part. Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define N 100005 // To store the graphvector<int> gr[N]; // To store colour of each vertexint colour[N]; // To store edgesvector<pair<int, int> > edges; // To check graph is bipartite or notbool bip; // Function to add edgesvoid add_edge(int x, int y){    gr[x].push_back(y);    gr[y].push_back(x);    edges.push_back(make_pair(x, y));} // Function to check given graph// is bipartite or notvoid dfs(int x, int col){    // colour the vertex x    colour[x] = col;     // For all it's child vertices    for (auto i : gr[x]) {        // If still not visited        if (colour[i] == -1)            dfs(i, col ^ 1);         // If visited and having        // same colour as parent        else if (colour[i] == col)            bip = false;    }} // Function to convert the undirected// graph into the directed graph such that// there is no path of length greater than 1void Directed_Graph(int n, int m){     // Initially each vertex has no colour    memset(colour, -1, sizeof colour);     // Suppose bipartite is possible    bip = true;     // Call bipartite function    dfs(1, 1);     // If bipartite is not possible    if (!bip) {        cout << -1;        return;    }     // If bipartite is possible    for (int i = 0; i < m; i++) {         // Make an edge from vertex having        // colour 1 to colour 0        if (colour[edges[i].first] == 0)            swap(edges[i].first, edges[i].second);         cout << edges[i].first << " "             << edges[i].second << endl;    }} // Driver codeint main(){    int n = 4, m = 3;     // Add edges    add_edge(1, 2);    add_edge(1, 3);    add_edge(1, 4);     // Function call    Directed_Graph(n, m);     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{static class pair{    int first, second;    public pair(int first, int second)    {        this.first = first;        this.second = second;    }} static int N = 100005; // To store the graphstatic Vector<Integer> []gr = new Vector[N]; // To store colour of each vertexstatic int []colour = new int[N]; // To store edgesstatic Vector<pair> edges = new Vector<>(); // To check graph is bipartite or notstatic boolean bip; // Function to add edgesstatic void add_edge(int x, int y){    gr[x].add(y);    gr[y].add(x);    edges.add(new pair(x, y));} // Function to check given graph// is bipartite or notstatic void dfs(int x, int col){    // colour the vertex x    colour[x] = col;     // For all it's child vertices    for (Integer i : gr[x])    {        // If still not visited        if (colour[i] == -1)            dfs(i, col ^ 1);         // If visited and having        // same colour as parent        else if (colour[i] == col)            bip = false;    }} // Function to convert the undirected// graph into the directed graph such that// there is no path of length greater than 1static void Directed_Graph(int n, int m){     // Initially each vertex has no colour    for (int i = 0; i < N; i++)        colour[i] = -1;     // Suppose bipartite is possible    bip = true;     // Call bipartite function    dfs(1, 1);     // If bipartite is not possible    if (!bip)    {        System.out.print(-1);        return;    }     // If bipartite is possible    for (int i = 0; i < m; i++)    {         // Make an edge from vertex having        // colour 1 to colour 0        if (colour[edges.get(i).first] == 0)        {            Collections.swap(edges, edges.get(i).first,                                    edges.get(i).second);        }         System.out.println(edges.get(i).first + " " +                           edges.get(i).second);    }} // Driver codepublic static void main(String[] args){    int n = 4, m = 3;    for (int i = 0; i < N; i++)        gr[i] = new Vector<>();             // Add edges    add_edge(1, 2);    add_edge(1, 3);    add_edge(1, 4);     // Function call    Directed_Graph(n, m);}} // This code is contributed by PrinciRaj1992
# Python3 implementation of the approach N = 100005  # To store the graphgr = [[] for i in range(N)]  # To store colour of each vertexcolour = [-1] * N  # To store edgesedges = []  # To check graph is bipartite or notbip = True  # Function to add edgesdef add_edge(x, y):     gr[x].append(y)    gr[y].append(x)    edges.append((x, y)) # Function to check given graph# is bipartite or notdef dfs(x, col):     # colour the vertex x    colour[x] = col    global bip      # For all it's child vertices    for i in gr[x]:        # If still not visited        if colour[i] == -1:            dfs(i, col ^ 1)          # If visited and having        # same colour as parent        elif colour[i] == col:            bip = False     # Function to convert the undirected# graph into the directed graph such that# there is no path of length greater than 1def Directed_Graph(n, m):     # Call bipartite function    dfs(1, 1)      # If bipartite is not possible    if not bip:        print(-1)        return         # If bipartite is possible    for i in range(0, m):          # Make an edge from vertex        # having colour 1 to colour 0        if colour[edges[i][0]] == 0:            edges[i][0], edges[i][1] = edges[i][1], edges[i][0]          print(edges[i][0], edges[i][1])  # Driver codeif __name__ == "__main__":     n, m = 4, 3      # Add edges    add_edge(1, 2)    add_edge(1, 3)    add_edge(1, 4)      # Function call    Directed_Graph(n, m)  # This code is contributed by Rituraj Jain
// C# implementation of the approachusing System;using System.Collections.Generic;     class GFG{ class pair{    public int first, second;    public pair(int first, int second)    {        this.first = first;        this.second = second;    }} static int N = 100005; // To store the graphstatic List<int> []gr = new List<int>[N]; // To store colour of each vertexstatic int []colour = new int[N]; // To store edgesstatic List<pair> edges = new List<pair>(); // To check graph is bipartite or notstatic Boolean bip; // Function to add edgesstatic void add_edge(int x, int y){    gr[x].Add(y);    gr[y].Add(x);    edges.Add(new pair(x, y));} // Function to check given graph// is bipartite or notstatic void dfs(int x, int col){    // colour the vertex x    colour[x] = col;     // For all it's child vertices    foreach (int i in gr[x])    {        // If still not visited        if (colour[i] == -1)            dfs(i, col ^ 1);         // If visited and having        // same colour as parent        else if (colour[i] == col)            bip = false;    }} // Function to convert the undirected// graph into the directed graph such that// there is no path of length greater than 1static void Directed_Graph(int n, int m){     // Initially each vertex has no colour    for (int i = 0; i < N; i++)        colour[i] = -1;     // Suppose bipartite is possible    bip = true;     // Call bipartite function    dfs(1, 1);     // If bipartite is not possible    if (!bip)    {        Console.Write(-1);        return;    }     // If bipartite is possible    for (int i = 0; i < m; i++)    {         // Make an edge from vertex having        // colour 1 to colour 0        if (colour[edges[i].first] == 0)        {            var v = edges[i].first;            edges[i].first = edges[i].second;            edges[i].second = v;        }         Console.WriteLine(edges[i].first + " " +                          edges[i].second);    }} // Driver codepublic static void Main(String[] args){    int n = 4, m = 3;    for (int i = 0; i < N; i++)        gr[i] = new List<int>();             // Add edges    add_edge(1, 2);    add_edge(1, 3);    add_edge(1, 4);     // Function call    Directed_Graph(n, m);}} // This code is contributed by Rajput-Ji
<script> // JavaScript code to implement the above approach// Python3 implementation of the approachlet N = 100005 // To store the graphlet gr = new Array(N);for(let i = 0; i < N; i++){    gr[i] = new Array()} // To store colour of each vertexlet colour = new Array(N).fill(-1) // To store edgeslet edges = [] // To check graph is bipartite or notlet bip = true // Function to add edgesfunction add_edge(x, y){     gr[x].push(y)    gr[y].push(x)    edges.push([x, y])} // Function to check given graph// is bipartite or notfunction dfs(x, col){     // colour the vertex x    colour[x] = col     // For all it's child vertices    for(let i of gr[x]){        // If still not visited        if(colour[i] == -1)            dfs(i, col ^ 1)         // If visited and having        // same colour as parent        else if(colour[i] == col)            bip = false    }}     // Function to convert the undirected// graph into the directed graph such that// there is no path of length greater than 1function Directed_Graph(n, m){     // Call bipartite function    dfs(1, 1)     // If bipartite is not possible    if(bip == 0){        document.write(-1,"</br>")        return    }         // If bipartite is possible    for(let i=0;i<m;i++){         // Make an edge from vertex        // having colour 1 to colour 0        if(colour[edges[i][0]] == 0){            let temp = edges[i][0]            edges[i][0] = edges[i][1]            edges[i][1] = temp        }         document.write(edges[i][0], edges[i][1],"</br>")    }}// Driver code let n =4, m = 3 // Add edgesadd_edge(1, 2)add_edge(1, 3)add_edge(1, 4) // Function callDirected_Graph(n, m) // This code is contributed by shinjanpatra </script>
1 2
1 3
1 4
rituraj_jain
princiraj1992
Rajput-Ji
shinjanpatra
Competitive Programming
Graph
Mathematical
Mathematical
Graph
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multistage Graph (Shortest Path)
Breadth First Traversal ( BFS ) on a 2D array
Check whether bitwise AND of a number with any subset of an array is zero or not
Shortest path in a directed graph by Dijkstra’s algorithm
5 Best Books for Competitive Programming
Breadth First Search or BFS for a Graph
Dijkstra's shortest path algorithm | Greedy Algo-7
Depth First Search or DFS for a Graph
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2