Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ สร้างกราฟแบบมีเงื่อนไข


สมมติว่าเรามีตัวเลขสองจำนวน N และ K พิจารณาว่ามีกราฟแบบไม่มีทิศทางที่มีองค์ประกอบ N จุดยอด N เป็นไปตามเงื่อนไขต่อไปนี้ -

  • กราฟเป็นแบบเรียบง่ายและเชื่อมโยง

  • จุดยอดมีตัวเลขตั้งแต่ 1 ถึง N

  • ให้ M เป็นจำนวนขอบในกราฟ ขอบมีหมายเลขตั้งแต่ 1 ถึง M ความยาวของขอบคือ 1 และขอบ i เชื่อมจุดยอด U[i] กับจุดยอด V[i]

  • มีจุดยอดคู่ K (i, j) โดยที่ i

หากมีกราฟดังกล่าว เราต้องสร้างกราฟนั้น มิฉะนั้น ให้ส่งคืน -1

ดังนั้นหากอินพุตเป็นเช่น N =5; K =3 แล้วผลลัพธ์จะเป็น

โปรแกรม C++ สร้างกราฟแบบมีเงื่อนไข

ขั้นตอน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

if k > (n - 1) * (n - 2) / 2, then:
   print -1
print ((n - 1) * (n - 2) / 2 - k + n - 1)
for initialize i := 1, when i < n, update (increase i by 1), do:
   print pair (1, i + 1)
count := (n - 1) * (n - 2) / 2 - k
for initialize i := 2, when i <= n, update (increase i by 1), do:
   for initialize j := i + 1, when j <= n, update (increase j by 1), do:
      if count <= 0, then:
         return
      print pair (i, j)
      (decrease count by 1)

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;

void solve(int n, int k){
   if (k > (n - 1) * (n - 2) / 2){
      cout << -1 << endl;
   }
   cout << (n - 1) * (n - 2) / 2 - k + n - 1 << '\n';
   for (int i = 1; i < n; i++){
      cout << 1 << ", " << i + 1 << '\n';
   }
   int count = (n - 1) * (n - 2) / 2 - k;
   for (int i = 2; i <= n; i++){
      for (int j = i + 1; j <= n; j++){
         if (count <= 0){
            return;
         }
         cout << i << ", " << j << '\n';
         count--;
      }
   }
}
int main(){
   int N = 5;
   int K = 3;
   solve(N, K);
}

อินพุต

5, 3

ผลลัพธ์

7
1, 2
1, 3
1, 4
1, 5
2, 3
2, 4
2, 5