使用BFS实现无向图环检测时遇begin函数匹配错误求助
无向图BFS环检测编译错误及代码修正
错误信息
./Solution.cpp:23:27: error: no matching function for call to 'begin(std::vector*&)'
错误出现在代码的for(auto nbr: adj)行。
原始代码
class Solution { public: // Function to detect cycle in an undirected graph. bool cyclicUsingDFS(int src, unordered_map<int,bool>& visited, vector<int> adj[]) { queue<int> q; unordered_map<int,bool> parent; q.push(src); visited[src]=true; parent[src]=-1; while(!q.empty()) { int frontnode = q.front(); q.pop(); for(auto nbr: adj) { if(!visited[nbr]) { q.push(nbr); visited[nbr]=true; parent[nbr]=frontnode; } if(visited[nbr] && nbr!=parent[frontnode]); { return true; } } } return false; } bool isCycle(int V, vector<int> adj[]) { unordered_map<int, bool> visited; for(int i=0; i<V; i++) { if(!visited[i]) { cyclicUsingDFS(i, visited,adj); } } } };
问题分析与修正
1. 编译错误根源
adj是vector<int>[]类型(本质是指向vector的指针数组),直接for(auto nbr: adj)是遍历指针数组,而非当前节点frontnode的邻接节点。正确做法是遍历adj[frontnode]——当前节点对应的邻接表。
2. 逻辑错误:多余的分号
第二个if语句末尾多了分号;,导致无论条件是否成立,都会执行return true,错误判定有环。必须去掉这个分号。
3. 缺少返回值
isCycle函数声明返回bool,但代码里无任何返回语句。需在遍历每个连通分量时,一旦cyclicUsingDFS返回true(找到环)就立即返回true;遍历完所有分量都没找到环,返回false。
4. 类型错误:parent存储类型错误
parent用unordered_map<int,bool>无法存储父节点编号,需改成unordered_map<int,int>才能正确记录父节点。
修正后的代码
class Solution { public: // Function to detect cycle in an undirected graph using BFS bool cyclicUsingBFS(int src, unordered_map<int, bool>& visited, vector<int> adj[]) { queue<int> q; unordered_map<int, int> parent; q.push(src); visited[src] = true; parent[src] = -1; while (!q.empty()) { int frontnode = q.front(); q.pop(); // 遍历当前节点的邻接表 for (auto nbr : adj[frontnode]) { if (!visited[nbr]) { q.push(nbr); visited[nbr] = true; parent[nbr] = frontnode; } // 去掉分号,正确判断邻接节点不是父节点 else if (visited[nbr] && nbr != parent[frontnode]) { return true; } } } return false; } bool isCycle(int V, vector<int> adj[]) { unordered_map<int, bool> visited; for (int i = 0; i < V; i++) { if (!visited[i]) { // 找到环立即返回true if (cyclicUsingBFS(i, visited, adj)) { return true; } } } // 所有分量无环,返回false return false; } };
额外说明
- 函数名
cyclicUsingDFS改为cyclicUsingBFS更准确,避免混淆实现逻辑。 - 若节点编号是连续的0到V-1,用
vector<int>替代unordered_map存储visited和parent,能获得更高的访问效率。
内容的提问来源于stack exchange,提问作者codecodecoder
相关产品推荐
相关产品推荐

