在图中找到 K 个与至少一个剩余顶点相连的顶点


可以使用深度优先搜索 (DFS) 来查找网络中与至少一个剩余顶点相连的 K 个顶点。您应该从剩余顶点之一开始,然后对该顶点执行 DFS。在搜索过程中遇到的每个顶点都将被记录,并将其添加到类似顶点的集合中。找到 K 个顶点或搜索完所有剩余顶点后,重复此过程。DFS 通过仔细探索图来找到仍然与至少一个剩余顶点相连的 K 个顶点,从而帮助完成任务。

使用的方法

  • DFS

  • BFS

DFS

在查找图表中与至少一个剩余顶点相连的 K 个顶点的情况下,可以使用深度优先搜索 (DFS)。选择剩余顶点之一,然后从该顶点启动 DFS。检查在探索图表时经过的每个顶点,并将其添加到连接顶点的集合中。继续检查图表,直到构建了 K 个顶点,识别了标准或检查了所有顶点。DFS 通过深度优先遍历区分保持与至少一个剩余顶点连接的 K 个顶点的证明,从而实现所需的目标。

算法

  • 初始化一个名为“connectedVertices”的集合,用于存储 K 个顶点。

  • 从剩余顶点中选择一个顶点“startVertex”。

  • 为 DFS 遍历创建一个名为“stack”的栈。

  • 将“startVertex”压入“stack”。

  • 当“stack”不为空时,

  • 从“stack”的顶部弹出一个顶点“currentVertex”。

  • 将“current vertex”标记为已访问。

  • 将“currentVertex”添加到“connectedVertices”集合中。

  • 遍历“currentVertex”的相邻顶点

  • 如果相邻顶点在剩余顶点内且未访问,

  • 将相邻顶点压入“stack”。

  • 重复步骤 2-5,直到所有 K 个顶点都被区分或所有剩余顶点都被探索。

示例

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

vector<int> findConnectedVertices(int startVertex, vector<vector<int>>& adjacencyList) {
   int N = adjacencyList.size(); // Total number of vertices
   vector<int> connectedVertices; // Set of connected vertices
   vector<bool> visited(N, false); // Track visited vertices
   stack<int> stack; // Stack for DFS traversal

   stack.push(startVertex); // Push the startVertex onto the stack

   while (!stack.empty()) {
      int currentVertex = stack.top();
      stack.pop();

      if (!visited[currentVertex]) {
         visited[currentVertex] = true;
         connectedVertices.push_back(currentVertex);

         for (int adjVertex : adjacencyList[currentVertex]) {
            if (!visited[adjVertex]) {
               stack.push(adjVertex);
            }
         }
      }
   }

   return connectedVertices;
}

int main() {
   int N = 7; // Total number of vertices
   vector<vector<int>> adjacencyList(N);

   // Add adjacency list for each vertex
   adjacencyList[0] = {1, 2};
   adjacencyList[1] = {0, 2};
   adjacencyList[2] = {0, 1, 3};
   adjacencyList[3] = {2, 4};
   adjacencyList[4] = {3};
   adjacencyList[5] = {6};
   adjacencyList[6] = {5};

   int startVertex = 0;
   vector<int> connectedVertices = findConnectedVertices(startVertex, adjacencyList);

   cout << "Connected Vertices: ";
   for (int vertex : connectedVertices) {
      cout << vertex << " ";
   }
   cout << endl;

   return 0;
}

输出

Connected Vertices: 0 2 3 4 1 

BSF

在查找图表中与至少一个剩余顶点相关的 K 个顶点的设置中,可以使用广度优先搜索 (BFS)。首先从剩余顶点中选择一个顶点,然后从该顶点执行 BFS。在查找过程中,检查每个经过的顶点并将其包含在关联顶点的集合中。逐层检查图表,确保在移至另一层之前先经过更近距离的顶点。重复此准备工作,直到识别出 K 个顶点或检查完所有剩余顶点。通过以广度优先的方式遍历图表,BFS 有助于识别保持与至少一个剩余顶点关联的 K 个顶点,从而完成手头的任务。

算法

  • 创建一个名为 S 的集合来存储关联的顶点。

  • 当 K > 且 R 不为空时,执行以下操作

  • a. 从 R 中选择一个顶点 v。

  • b. 从 v 开始执行广度优先搜索 (BFS)。

  • c. 在 BFS 期间,标记每个经过的顶点并将其添加到 S 中。

  • d. 将 K 减 1。

  • e. 从 R 中移除 V。

  • 返回包含 K 个关联顶点的集合 S。

  • 该算法从剩余顶点中选择一个顶点,并对该顶点执行 BFS。它标记每个经过的顶点并将其包含在关联顶点的集合中。该策略持续进行,直到识别出 K 个顶点或没有剩余顶点被清除。

示例

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

std::unordered_set<int> purgeVertices(int K, const std::vector<std::vector<int>>& graph) {
   std::unordered_set<int> S;
   std::vector<bool> visited(graph.size(), false);
    
   auto bfs = [&](int start) {
      std::queue<int> q;
      q.push(start);
        
      while (!q.empty()) {
         int v = q.front();
         q.pop();
            
         if (!visited[v]) {
            visited[v] = true;
            S.insert(v);
            K--;
                
            if (K == 0) {
               return;
            }
                
            for (int neighbor : graph[v]) {
               if (!visited[neighbor]) {
                  q.push(neighbor);
               }
            }
         }
      }
   };
    
   for (int i = 0; i < graph.size() && K > 0; i++) {
      bfs(i);
   }
    
   return S;
}

int main() {
   // Example usage
   int K = 3;
   std::vector<std::vector<int>> graph = {
      {1, 2},
      {0, 2, 3},
      {0, 1, 3},
      {1, 2}
   };
    
   std::unordered_set<int> result = purgeVertices(K, graph);
    
   // Print the resulting set
   std::cout << "Purged vertices: ";
   for (int v : result) {
      std::cout << v << " ";
   }
   std::cout << std::endl;
    
   return 0;
}

输出

Purged vertices: 2 1 0 

结论

本文提供了一种算法方法,用于查找图表中与至少一个剩余顶点相关的 K 个顶点。该算法利用深度优先搜索 (DFS) 或广度优先搜索 (BFS) 来遍历图表并识别指定的顶点。它包含 C 中的代码片段,这些代码片段使用不同的函数来执行搜索操作。本文旨在帮助软件工程师理解和执行识别图表中相关顶点的方法,从而促进依赖图表网络的不同应用程序和检查。

更新于: 2023-07-19

92 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告