Given two positive integers **N** and **K**, the task is to construct a simple and connected graph consisting of **N** vertices with length of each edge as **1** unit, such that the shortest distance between exactly **K** pairs of vertices is **2**. If it is not possible to construct the graph, then print **-1**. Otherwise, print the edges of the graph.

**Examples:**

Input:N = 5, K = 3

Output:{ { 1, 2 }, { 1, 3}, { 1, 4 }, { 1, 5 }, { 2, 3 }, { 2, 4 }, { 2, 5 } }

Explanation:

The distance between the pairs of vertices { (3, 4), (4, 5), (3, 5) } is 2.

Input:N = 5, K = 8

Output:-1

**Approach:** Follow the steps below to solve the problem:

- Since the graph is simple and connected, Therefore, the maximum possible count of edges say
**Max**is**((N – 1) * (N – 2)) / 2**. - If
**K**is greater than**Max**, then print**-1**. - Initialize an array, say
**edges[]**, to store the edges of the graph. - Otherwise, first connect all the vertices with
**1**and store it in**edges[]**, then connect all the pairs of vertices**(i, j)**such that**i >= 2**and**j > i**and store it in**edges[]**. - Finally, print the first
**((N – 1) + Max – K )**elements of**edges[]**array.

Below is the implementation of the above approach:

## C++

`// C++ program to impelementn ` `// the above approach ` ` ` `#include <iostream> ` `#include <vector> ` `using` `namespace` `std; ` ` ` `// Function to construct the simple and ` `// connected graph such that the distance ` `// between exactly K pairs of vertices is 2 ` `void` `constGraphWithCon(` `int` `N, ` `int` `K) ` `{ ` ` ` ` ` `// Stores maximum possible count ` ` ` `// of edges in a graph ` ` ` `int` `Max = ((N - 1) * (N - 2)) / 2; ` ` ` ` ` `// Base Case ` ` ` `if` `(K > Max) { ` ` ` `cout << -1 << endl; ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Stores edges of a graph ` ` ` `vector<pair<` `int` `, ` `int` `> > ans; ` ` ` ` ` `// Connect all vertices of pairs (i, j) ` ` ` `for` `(` `int` `i = 1; i < N; i++) { ` ` ` `for` `(` `int` `j = i + 1; j <= N; j++) { ` ` ` `ans.emplace_back(make_pair(i, j)); ` ` ` `} ` ` ` `} ` ` ` ` ` `// Print first ((N - 1) + Max - K) elements ` ` ` `// of edges[] ` ` ` `for` `(` `int` `i = 0; i < (N - 1) + Max - K; i++) { ` ` ` `cout << ans[i].first << ` `" "` ` ` `<< ans[i].second << endl; ` ` ` `} ` `} ` ` ` `// Driver Code ` `int` `main() ` `{ ` ` ` `int` `N = 5, K = 3; ` ` ` `constGraphWithCon(N, K); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## C

`// C++ program to impelementn ` `// the above approach ` ` ` `#include <iostream> ` `#include <vector> ` `using` `namespace` `std; ` ` ` `// Function to construct the simple and ` `// connected graph such that the distance ` `// between exactly K pairs of vertices is 2 ` `void` `constGraphWithCon(` `int` `N, ` `int` `K) ` `{ ` ` ` ` ` `// Stores maximum possible count ` ` ` `// of edges in a graph ` ` ` `int` `Max = ((N - 1) * (N - 2)) / 2; ` ` ` ` ` `// Base Case ` ` ` `if` `(K > Max) { ` ` ` `printf` `(` `"-1"` `); ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Stores count of edges in a graph ` ` ` `int` `count = 0; ` ` ` ` ` `// Connect all vertices of pairs (i, j) ` ` ` `for` `(` `int` `i = 1; i < N; i++) { ` ` ` ` ` `for` `(` `int` `j = i + 1; j <= N; j++) { ` ` ` ` ` `printf` `(` `"%d %d\n"` `, i, j); ` ` ` ` ` `// Update ` ` ` `count++; ` ` ` ` ` `if` `(count == N * (N - 1) / 2 - K) ` ` ` `break` `; ` ` ` `} ` ` ` ` ` `if` `(count == N * (N - 1) / 2 - K) ` ` ` `break` `; ` ` ` `} ` `} ` ` ` `// Driver Code ` `int` `main() ` `{ ` ` ` `int` `N = 5, K = 3; ` ` ` `constGraphWithCon(N, K); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

1 2 1 3 1 4 1 5 2 3 2 4 2 5

**Time Complexity:** O(N^{2})

**Auxiliary Space:** O(N^{2})

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.