使用vector实现有向图搜索时push_back调用报错,求修复方案
问题修复方案
编译错误原因
你定义的graph是vector<int>类型,这意味着graph[i]返回的是一个int值,而push_back()是std::vector类的成员函数,int类型没有这个方法,所以编译器报错。
有向图的邻接表需要用二维vector(即vector<vector<int>>)来实现:每个索引对应一个节点,索引对应的vector存储该节点指向的所有邻接节点。
修复后的代码
#include <iostream> #include <vector> using namespace std; // 改为二维vector,每个节点对应一个存储邻接点的vector vector<vector<int>> graph(1001); int n, a; // 修正find函数:去掉全局sum,改为传参或用局部变量,同时确保递归返回值 int find(int x, int sum = 1) { // 这里的逻辑需要根据你的实际需求调整,原逻辑可能不符合有向图搜索的预期 // 示例逻辑:假设是找环的长度,你需要根据实际场景修改 if (graph[x].empty()) { return sum; } // 假设每个节点只有一个出边(如拓扑结构),如果是多邻接点需要遍历 int next = graph[x][0]; if (next == x) { return sum; } return find(next, sum + 1); } int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a; // 现在graph[i]是vector<int>,可以正常调用push_back添加邻接点 graph[i].push_back(a); } for (int i = 1; i <= n; i++) { int result = find(i); cout << "节点" << i << "的搜索结果:" << result << endl; } return 0; }
额外需要调整的点
- 全局变量问题:原代码中的
sum是全局变量,多次调用find会导致累加错误,改为函数参数传递更合理。 - find函数逻辑:原函数的判断条件
graph[x]==graph[graph[x]]逻辑模糊,需要根据你实际的搜索需求(比如找环、路径长度等)调整。示例中假设每个节点只有一个出边,如果你需要处理多邻接点的情况,需要在find函数中遍历graph[x]的所有元素。 - 递归返回值:原递归调用
find(graph[graph[x]])没有返回值,会导致函数行为未定义,必须加上return。
内容的提问来源于stack exchange,提问作者rlatlsgn
相关产品推荐
相关产品推荐

