You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图的孤立顶点数统计代码结果错误,求修正方案(附邻接表代码)

问题分析与修正方案

核心错误

你的代码统计孤立顶点的逻辑完全错误:

  • 原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:24:26