C++ 程序查找两个给定节点之间是否存在路径

c++server side programmingprogramming更新于 2024/10/25 1:57:00

这是一个 C++ 程序,用于查找两个给定节点之间是否存在路径

算法

开始
   function isReach() 是一个递归函数,用于检查 d 是否可到达 s:
   A) 将所有顶点标记为未访问。
   B) 将当前节点标记为已访问并将其入队,它将用于获取顶点的所有相邻顶点。
   C) 从队列中出队顶点并打印它。
   D) 获取出队顶点 s 的所有相邻顶点。
   E) 如果相邻节点尚未被访问,则将其标记为已访问并将其入队。
   F) 如果此相邻节点是目标节点,则返回 true,否则继续 BFS。
结束

示例

#include <iostream>
#include <list>
using namespace std;
class G {
   int n;
   list<int> *adj;
   public:
      G(int n);
      void addEd(int x, int w);
      bool isReach(int s, int d);
};
G::G(int n) { //构造函数
   this->n = n;
   adj = new list<int> [n];
}
void G::addEd(int x, int w) { //将边添加到图中
   adj[x].push_back(w); //将 w 添加到 x 的列表中
}
bool G::isReach(int s, int d) {
   if (s == d)
   return true;
   bool *visited = new bool[n];
   //将所有顶点标记为未访问。
   for (int i = 0; i < n; i++)
      visit[i] = false;
   list<int> query;
   //将当前节点标记为已访问并将其入队,它将用于获取顶点的所有相邻顶点
   visited[s] = true;
   queue.push_back(s);
   list<int>::iterator i;
   while (!queue.empty()) {
      s =queue.front();
   queue.pop_front();//从队列中出列一个顶点并打印
   //如果相邻顶点尚未被访问,
      for (i = adj[s].begin(); i != adj[s].end(); ++i) {
         if (*i == d)
            return true;
         if (!visited[*i]) {
            visited[*i] = true;
            queue.push_back(*i);
         }
      }
   }
   return false;
}
int main() {
   G g(4);
   g.addEd(1, 3);
   g.addEd(0, 1);
   g.addEd(2, 3);
   g.addEd(1, 0);
   g.addEd(2, 1);
   g.addEd(3, 1);
   cout << "输入源和目标顶点:(0-3)";
   int a, b;
   cin >> a >> b;
   if (g.isReach(a, b))
      cout << "\n有一条从 << a << " 到 << b; 的路径
   else
      cout << "\n没有从 << a << " 到 << 的路径<< b;
   int t;
   t = a;
   a = b;
   b= t;
   if (g.isReach(a, b))
      cout << "\n有一条从 << a << " 到 << b; 的路径
   else
      cout << "\n没有从 << a << " 到 << b; 的路径
   return 0;
}

输出

输入源和目标顶点:(0-3)
有一条从 3 到 1 的路径
有一条从 1 到 3 的路径

相关文章