图的孤立顶点数统计代码结果错误,求修正方案(附邻接表代码)
问题分析与修正方案
核心错误
你的代码统计孤立顶点的逻辑完全错误:
- 原
FindIsolated函数是遍历所有邻接表元素,只要元素等于0就计数,这和“孤立顶点”的定义毫无关系。当前输出2是因为顶点0的邻接表里有两个0(来自addEdge(adj,0,0)的两次push_back),导致计数为2。 - 同时
main中添加的addEdge(adj,0,0)会给顶点0添加自环,按标准图论定义,有自环的顶点度数不为0,不属于孤立顶点,这也和你的预期输出矛盾。
修正方案(按标准孤立顶点定义)
孤立顶点的标准定义是度数为0的顶点,即没有任何边(包括自环)连接的顶点。
1. 修正FindIsolated函数
将判断逻辑改为检查顶点的邻接表是否为空(为空则度数为0,是孤立顶点):
int FindIsolated(std::vector<int> adj[V]) { int isolated = 0; for(int v = 0; v < V; ++v) { // 邻接表为空,说明该顶点无任何边,是孤立顶点 if(adj[v].empty()) { isolated++; } } return isolated; }
2. 修正main函数
如果你预期孤立顶点数为1,说明图中应该有一个无任何边的顶点,因此需要移除给顶点0添加自环的代码:
int main() { std::vector<int> adj[V]; addEdge(adj, 1, 2); addEdge(adj, 1, 3); // 移除这条添加自环的语句,让顶点0成为孤立顶点 // addEdge(adj, 0, 0); std::cout << "This graph contains " << FindIsolated(adj) << " isolated vertices" << std::endl; std::cin.get(); return 0; }
修正后运行,顶点0的邻接表为空,会被统计为孤立顶点,输出结果为This graph contains 1 isolated vertices,符合预期。
特殊情况处理(若你认为自环顶点也算孤立)
如果你的需求是“仅与自身相连的顶点也算孤立”(非标准定义),可以修改FindIsolated函数的判断逻辑,检查顶点的邻接表中是否只有自身元素:
int FindIsolated(std::vector<int> adj[V]) { int isolated = 0; for(int v = 0; v < V; ++v) { bool hasOtherVertex = false; for(auto x : adj[v]) { if(x != v) { hasOtherVertex = true; break; } } // 没有连接其他顶点,算作孤立 if(!hasOtherVertex) { isolated++; } } return isolated; }
这种情况下,即使保留addEdge(adj,0,0),顶点0也会被统计为孤立顶点,输出结果同样为1。
内容的提问来源于stack exchange,提问作者Venom ___Manny
相关产品推荐
相关产品推荐

