• 为什么输出的深度和广度优先遍历的结果只有24并且最小生成树的结果也不正确


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 qq_20614949 2024-06-02 21:02 采纳率: 19.4% 浏览 1 首页/ 编程语言 / 为什么输出的深度和广度优先遍历的结果只有24并且最小生成树的结果也不正确 c++ #include #include #include #include #define MAXV 100 #define INF 33333 using namespace std; //创建邻接表 typedef struct ANode{ struct ANode *nextarc; int adjvex; int weight; }ArcNode; typedef struct Vnode{ ArcNode *firstarc; }VNode; typedef struct{ VNode adjlist[MAXV]; int n,e; }AdjGraph; void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e){ int i,j; ArcNode *p; G=(AdjGraph*)malloc(sizeof(AdjGraph)); for(i=0;iadjlist[i].firstarc=NULL; for(i=0;i=0;j--) if(A[i][j]!=0&&A[i][j]!=INF){ p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; p->weight=A[i][j]; p->nextarc=G->adjlist[i].firstarc; G->adjlist[i].firstarc=p; } G->n=n; G->e=e; } //创建邻接矩阵 typedef struct{ int no; }VertexType; typedef struct{ int edges[MAXV][MAXV]; int n,e; VertexType vexs[MAXV]; }MatGraph; void CreatGraph(MatGraph *&G,int a[MAXV][MAXV],int k,int v)//创建有向图的邻接矩阵 { G=new MatGraph; int i,j,w; G->n=k; G->e=v; for(int i=0;in;i++) { G->vexs[i].no=i; } for(int i=0;in;i++)//初始化邻接矩阵 for(int j=0;jn;j++) G->edges[i][j]=a[i][j]; } typedef struct{ int data[MAXV]; int front,rear; }SqQueue; void InitQueue(SqQueue *&q) { q = new SqQueue; q->front = q->rear = 0; } bool enQueue(SqQueue *&q, int e) { if ((q->rear + 1) % MAXV == q->front) return false; q->rear = (q->rear + 1) % MAXV; q->data[q->rear] = e; return true; } bool QueueEmpty(SqQueue *&q) { return (q->front == q->rear); } bool deQueue(SqQueue *&q, int &e) { if (q->front == q->rear) return false; q->front = (q->front + 1) % MAXV; e = q->data[q->front]; return true; } //深度优先遍历 void DFS(AdjGraph *G,int v,int visited[]){ ArcNode *p; int w; visited[v]=1; cout<adjlist[v].firstarc; while(p!=NULL){ w=p->adjvex; if(visited[w]==0) DFS(G,w,visited); p=p->nextarc; } } //广度优先遍历 void BFS(AdjGraph *g,int v){ int w,i; ArcNode *p; SqQueue *qu; InitQueue(qu); int visited[MAXV] = {0}; cout<adjlist[w].firstarc; while(p!=NULL){ if(visited[p->adjvex]==0){ cout<adjvex; visited[p->adjvex]=1; enQueue(qu,p->adjvex); } p=p->nextarc; } } cout<<'\n'; } void Prim(MatGraph *g,int v) { int lowcost[MAXV]; int min,i,j,k; int closest[MAXV]; for(i=0;in;i++){ lowcost[i]=g->edges[v][i]; closest[i]=v; } for(i=1;in;i++){ min=INF; for(j=0;jn;j++) if(lowcost[j]!=0&&lowcost[j]n;j++) if(lowcost[j]!=0&&g->edges[k][j]edges[k][j]; closest[j]=k; } } } int main() { int n=5,e=9,v=2; int A[MAXV][MAXV]={{0,8,INF,5,INF},{INF,0,3,INF,INF},{INF,INF,0,INF,6},{INF,INF,9,0,INF},{INF,INF,INF,INF,0}}; AdjGraph *g; CreateAdj(g,A,n,e); int visited[MAXV]={0}; cout<<"深度优先遍历的结果为"<

    3条回答 默认 最新

    • 关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      问题原因:

      1. 深度优先遍历和广度优先遍历的代码看起来没有问题,但最小生成树算法Prim()存在一个错误。在Prim算法中,lowcost数组应该记录的是到目前为止找到的最短路径,而不是直接的边权重。在更新lowcostclosest数组时,需要将lowcost[j]设置为g->edges[k][j]而不是g->edges[v][i]

      解决方案:

      1. 修改Prim函数中的更新逻辑,将lowcost[j]设置为g->edges[k][j],如下所示:
      for (i = 1; i < g->n; i++) {
          min = INF;
          for (j = 0; j < g->n; j++)
              if (lowcost[j] != 0 && lowcost[j] < min) {
                  min = lowcost[j];
                  k = j;
              }
          // 更新lowcost和closest
          lowcost[k] = g->edges[k][j]; // 这里改为 g->edges[k][j]
          closest[k] = k;
      
          for (j = 0; j < g->n; j++)
              if (lowcost[j] != 0 && g->edges[k][j] < lowcost[j]) {
                  lowcost[j] = g->edges[k][j];
                  closest[j] = k;
              }
      }
      

      这样修改后,你应该能看到正确的深度优先遍历和广度优先遍历结果,以及最小生成树的正确路径。

      评论 编辑记录
    • 阿里嘎多学长 2024-06-02 21:02
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      【解题思路】:检查代码中图的构建和遍历算法实现是否正确,确保邻接矩阵或邻接表正确初始化并使用。

      评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-02 21:02
      关注

      引自免费微信小程序:皆我百晓生

      在分析这段代码之前,首先确认一下输入矩阵A代表的是一个加权无向图。对于深度优先搜索(DFS)和广度优先搜索(BFS),代码看起来是正确的。但是,在输出结果中只显示了节点 24,这可能是因为在邻接矩阵中,从起始点 v=2 开始,其他节点没有与之相连。

      为了修复这个问题,我们需要确保邻接矩阵中的所有节点都至少有一个路径可以到达。例如,你可以尝试添加一些边,使图成为一个连通图。以下是修改后的邻接矩阵:

      int A[MAXV][MAXV]={{0,8,INF,5,INF},{INF,0,3,INF,INF},{INF,INF,0,INF,6},{INF,INF,9,0,INF},{INF,INF,INF,INF,0}};
      

      变为:

      int A[MAXV][MAXV]={{0,8,1,5,INF},{INF,0,3,INF,1},{INF,INF,0,INF,6},{INF,INF,9,0,1},{1,INF,INF,INF,0}};
      

      这里我在矩阵的适当位置添加了一些权重较小的边,使得整个图成为一个连通图。

      对于最小生成树算法Prim,它用于求解加权无向图的最小生成树。代码看起来也是正确的,但同样需要注意输入的图是否是连通的。在这个例子中,我们已经通过修改邻接矩阵使其成为连通图,所以最小生成树应该能正常工作。

      下面是经过修改的完整代码,包括添加边以及测试结果:

      #include
      #include 
      #include
      #include
      #define MAXV 100
      #define INF 33333
      using namespace std;
      
      //... (保持原样)
      
      int main()
      {
          int n=5,e=13,v=2;
          // 修改后的邻接矩阵,确保图是连通的
          int A[MAXV][MAXV]={{0,8,1,5,INF},{INF,0,3,INF,1},{INF,INF,0,INF,6},{INF,INF,9,0,1},{1,INF,INF,INF,0}};
          AdjGraph *g;
          CreateAdj(g,A,n,e);
          int visited[MAXV]={0};
          cout<<"深度优先遍历的结果为:"<

      运行这个修改后的程序,你应该能看到完整的深度优先搜索、广度优先搜索的结果,并且最小生成树也应该正确输出。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    类和对象(封装)
    web3之女巫(sybil)
    JS,BOM试题,在实践中应用,非常详细!!
    OpenFeign设置header的3种方式
    拨开发展迷雾,将“智慧”嵌入全业务场景【2022戴尔科技峰会预告】
    前后端分离项目Nginx部署
    C++ move()排序函数用法详解(深入了解,一文学会)
    靶机: medium_socnet
    C++ 入门到踩坑
    【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)
  • 原文地址:https://ask.csdn.net/questions/8113084