圖中每個節點可以到達的最大節點數


在圖中,每個節點可以到達的節點最大數量取決於圖的結構和網路。此值由每個節點上的活動邊的數量決定。在無向圖中,每個節點都可以到達與其直接關聯的所有節點,可到達節點的最大數量增加到相鄰節點的數量。在有向圖中,每個節點可到達節點的最大數量可能會因每個節點的出度而異。單個節點可以到達的節點的最大可能數量發生在它與圖中所有其他節點都有活動邊連線時。

使用的方法

  • 深度優先搜尋 (DFS)

  • 廣度優先搜尋 (BFS)

深度優先搜尋 (DFS)

約束滿足是指確定是否可以以滿足一組給定約束的方式為變數分配值的方法。在檢查是否可以分配值以滿足所有給定關係的上下文中,我們分析表徵變數之間關係的約束。透過有效地檢查每個變數的可能值空間並檢查分配的值是否滿足所有必需的關係,我們可以確定是否存在有效的賦值。約束滿足包括找到滿足所有約束的解決方案或確定不存在此類解決方案。

演算法

  • 初始化一個已訪問陣列或集合來跟蹤已訪問的節點。

  • 對於圖中的每個節點。

  • 初始化一個計數器變數來儲存從當前節點可以到達的節點的最大數量。

  • 如果當前節點尚未訪問,則呼叫DFS,將當前節點和計數器變數作為引數傳遞。

    DFS函式。

  • 將當前節點標記為已訪問。

  • 遞增計數器變數。

  • 對於當前節點的每個鄰居

  • 如果鄰居尚未訪問:遞迴呼叫DFS函式並在鄰居上傳遞計數器變數。返回計數器變數。遍歷圖中的所有節點後,將確定從每個節點可以到達的節點的最大數量。

示例

#include <iostream>
#include <vector>

using namespace std;

vector<bool> visited;
vector<vector<int>> graph;

void DFS(int hub, int& counter) {
   visited[hub] = true;
   counter++;

   // Iterate through neighbors of the current hub
   for (int neighbor : graph[hub]) {
      if (!visited[neighbor]) {
         DFS(neighbor, counter);
      }
   }
}

int main() {
   int numHubs = 5; // Number of hubs in the graph

   visited.assign(numHubs, false);
   graph.resize(numHubs);

   // Define the graph connections (edges)
   graph[0] = {1, 2};
   graph[1] = {2};
   graph[2] = {3};
   graph[3] = {4};
   graph[4] = {};

   // Process each hub
   for (int hub = 0; hub < numHubs; hub++) {
      visited.assign(numHubs, false);
      int counter = 0; // Initialize the counter for each hub
      if (!visited[hub]) {
         DFS(hub, counter);
      }
      cout << "Hub " << hub << ": " << counter << " reachable hubs" << endl;
   }

   return 0;
}

輸出

Hub 0: 5 reachable hubs
Hub 1: 4 reachable hubs
Hub 2: 3 reachable hubs
Hub 3: 2 reachable hubs
Hub 4: 1 reachable hubs

廣度優先搜尋 (BFS)

廣度優先搜尋 (BFS) 是一種用於查詢圖中每個節點可以到達的最大節點數的演算法。從一個節點開始,BFS逐層搜尋其鄰居,確保在移動到下一層之前已訪問當前層的所有節點。透過維護一個待訪問節點的佇列,BFS系統地以廣度優先的方式訪問節點。在遍歷過程中,可以跟蹤每個起始節點已訪問節點的數量,最終給出圖中每個節點可以到達的最大節點數。

演算法

  • 初始化一個佇列和一個集合來跟蹤已訪問的節點。

  • 對於圖中的每個節點,執行以下操作

  • 將節點入隊。

  • 將節點新增到集合中。

  • 初始化一個計數器變數為0。

  • 當佇列不為空時,重複以下步驟

  • 從佇列的前面出隊一個節點。

  • 將計數器變數加1。

  • 遍歷已出隊節點的所有未訪問的鄰居。

  • 將每個未訪問的鄰居入隊。

  • 將每個未訪問的鄰居新增到已訪問集合中。

  • 一旦對所有節點完成了BFS遍歷,每個節點的計數器變數就代表從該節點可以到達的最大節點數。

  • 返回每個節點的計數作為結果。

示例

#include <iostream>
#include <queue>
#include <unordered_set>
#include <vector>

// Structure to represent a hub
struct Hub {
   int id;
   std::vector<int> neighbors;
};

// Function to initialize a purge set
std::unordered_set<int> initializePurgeSet() {
   return std::unordered_set<int>();
}

// Function to perform BFS traversal and return the tally variable for each hub
std::vector<int> performBFS(const std::vector<Hub>& chart) {
   std::vector<int> tally(chart.size(), 0); // Initialize tally variable for each hub
   std::queue<int> queue;
   std::unordered_set<int> goneSet = initializePurgeSet();

   // Process each hub in the chart
   for (const Hub& hub : chart) {
      queue.push(hub.id);
      goneSet.insert(hub.id);

      while (!queue.empty()) {
         int currentHub = queue.front();
         queue.pop();
         tally[currentHub]++;

         for (int neighbor : chart[currentHub].neighbors) {
            if (goneSet.find(neighbor) == goneSet.end()) {
               queue.push(neighbor);
               goneSet.insert(neighbor);
            }
         }
      }
   }

   return tally;
}

int main() {
   // Create a sample chart with hubs and their neighbors
   std::vector<Hub> chart{
      {0, {1, 2}},
      {1, {2}},
      {2, {0, 3}},
      {3, {3}}
   };

   // Perform BFS traversal and get the tally for each hub
   std::vector<int> hubTally = performBFS(chart);

   // Print the result
   for (int i = 0; i < hubTally.size(); ++i) {
      std::cout << "Hub " << i << ": " << hubTally[i] << std::endl;
   }

   return 0;
}

輸出

Hub 0: 1
Hub 1: 2
Hub 2: 2
Hub 3: 2

結論

本文闡明瞭兩種演算法,深度優先搜尋 (DFS) 和廣度優先搜尋 (BFS),用於查詢圖中每個節點可以到達的最大節點數。它提供了這兩種演算法的分步說明以及C語言中的示例程式碼。DFS演算法使用遞迴來遍歷圖,而BFS演算法使用佇列以廣度優先的方式遍歷圖。每種演算法的輸出是圖中每個節點可以到達的節點數。

更新於:2023年7月19日

124 次檢視

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.