给定两个正整数N和K ,任务是构造一个由N个顶点组成的简单连通图,其中每条边的长度为1 个单位,使得恰好K对顶点之间的最短距离为2 。如果无法构建图形,则打印-1 。否则,打印图形的边缘。
例子:
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
处理方法:按照以下步骤解决问题:
- 由于图简单且连通,因此,最大可能的边数,比如说Max是((N – 1) * (N – 2)) / 2 。
- 如果K大于Max ,则打印-1 。
- 初始化一个数组,比如edges[] ,来存储图的边。
- 否则,首先将所有顶点与1连接并将其存储在edge[] 中,然后连接所有顶点对(i, j)使得i >= 2和j > i并将其存储在edge[] 中。
- 最后,打印edge[]数组的第一个((N – 1) + Max – K ) 个元素。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
#include
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 > 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;
}
C
// C program to implement
// the above approach
#include
// 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;
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to construct the simple and connected
// graph such that the distance between
// exactly K pairs of vertices is 2
static 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)
{
System.out.print(-1 + "\n");
return;
}
// Stores edges of a graph
Vector ans = new Vector<>();
// Connect all vertices of pairs (i, j)
for(int i = 1; i < N; i++)
{
for(int j = i + 1; j <= N; j++)
{
ans.add(new pair(i, j));
}
}
// Print first ((N - 1) + Max - K) elements
// of edges[]
for(int i = 0; i < (N - 1) + Max - K; i++)
{
System.out.print(ans.get(i).first + " " +
ans.get(i).second +"\n");
}
}
// Driver Code
public static void main(String[] args)
{
int N = 5, K = 3;
constGraphWithCon(N, K);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to implement
# the above approach
# Function to construct the simple and
# connected graph such that the distance
# between exactly K pairs of vertices is 2
def constGraphWithCon(N, K):
# Stores maximum possible count
# of edges in a graph
Max = ((N - 1) * (N - 2)) // 2
# Base case
if (K > Max):
print(-1)
return
# Stores edges of a graph
ans = []
# Connect all vertices of pairs (i, j)
for i in range(1, N):
for j in range(i + 1, N + 1):
ans.append([i, j])
# Print first ((N - 1) + Max - K) elements
# of edges[]
for i in range(0, (N - 1) + Max - K):
print(ans[i][0], ans[i][1], sep = " ")
# Driver code
if __name__ == '__main__':
N = 5
K = 3
constGraphWithCon(N, K)
# This code is contributed by MuskanKalra1
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
public class GFG{
class pair
{
public int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to construct the simple and connected
// graph such that the distance between
// exactly K pairs of vertices is 2
static 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)
{
Console.Write(-1 + "\n");
return;
}
// Stores edges of a graph
List ans = new List();
// Connect all vertices of pairs (i, j)
for(int i = 1; i < N; i++)
{
for(int j = i + 1; j <= N; j++)
{
ans.Add(new pair(i, j));
}
}
// Print first ((N - 1) + Max - K) elements
// of edges[]
for(int i = 0; i < (N - 1) + Max - K; i++)
{
Console.Write(ans[i].first + " " +
ans[i].second +"\n");
}
}
// Driver Code
public static void Main(String[] args)
{
int N = 5, K = 3;
constGraphWithCon(N, K);
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
1 2
1 3
1 4
1 5
2 3
2 4
2 5
时间复杂度: O(N 2 )
辅助空间: O(N 2 )
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。