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 的路径