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

Graph Valid Tree ใน C++


สมมติว่ามี n โหนดติดป้าย 0 ถึง n-1 และรายการขอบแบบไม่มีทิศทาง [u,v] เราต้องกำหนดฟังก์ชันตรวจสอบว่าขอบเหล่านี้สร้าง valid tree ได้หรือไม่

เช่น ถ้าอินพุทเป็น n = 5, และ edges = [[0,1], [0,2], [0,3], [1,4]] ผลลัพธ์จะเป็น true

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

  • กำหนดฟังก์ชัน dfs() รับ node, par, graph, อาร์เรย์ visited

  • ถ้า visited[node] เท่ากับ 1 แล้ว −

    • คืนค่า true

  • ถ้า visited[node] เท่ากับ 2 แล้ว −

    • คืนค่า false

  • visited[node] := 2

  • ret := true

  • ลูป i := 0 ถึงขนาดของ graph[node]-1 ทำ −

    • ถ้า graph[node][i] ไม่เท่ากับ par แล้ว −

      • ret := ret AND dfs(graph[node][i], node, graph, visited)

  • visited[node] := 1

  • คืนค่า ret

  • จากเมธอดหลักทำดังนี้ −

  • กำหนดอาร์เรย์ visited ขนาด n เติม 0

  • กำหนดรายการรายการ graph ขนาด n

  • ลูป i := 0 ถึงขนาดของ edges-1 ทำ −

    • u := edges[i][0], v := edges[i][1]

    • แทรก v ที่ท้ายของ graph[u]

    • แทรก u ที่ท้ายของ graph[v]

  • ถ้า dfs(0, -1, graph, visited) เป็น false แล้ว −

    • คืนค่า false

  • ลูป i := 0 ถึง n-1 ทำ −

    • ถ้า visited[i] เป็นศูนย์ แล้ว −

      • คืนค่า false

  • คืนค่า true

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

#include <bits/stdc++.h> using namespace std; class Solution { public:    bool dfs(int node, int par, vector <int> graph[], vector <int>& visited){       if (visited[node] == 1)          return true;       if (visited[node] == 2)          return false;       visited[node] = 2;       bool ret = true;       for (int i = 0; i < graph[node].size(); i++) {          if (graph[node][i] != par)             ret &= dfs(graph[node][i], node, graph, visited);       }       visited[node] = 1;       return ret;    }    bool validTree(int n, vector<vector<int>>& edges) {       vector<int> visited(n, 0);       vector<int> graph[n];       for (int i = 0; i < edges.size(); i++) {          int u = edges[i][0];          int v = edges[i][1];          graph[u].push_back(v);          graph[v].push_back(u);       }       if (!dfs(0, -1, graph, visited))          return false;       for (int i = 0; i < n; i++) {          if (!visited[i])             return false;       }       return true;    } }; main(){    Solution ob;    vector<vector<int>> v = {{0,1},{0,2},{0,3},{1,4}};    cout << (ob.validTree(5,v)); }

อินพุท

5, {{0,1},{0,2},{0,3},{1,4}}

เอาต์พุท

1