三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 253|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo7-3.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 09:26:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo7-3.c 实现算法7.10、7.11的程序 */
  2. #include"c1.h"
  3. #define MAX_NAME 2 /* 顶点字符串的最大长度+1 */
  4. typedef int InfoType;
  5. typedef char VertexType[MAX_NAME]; /* 字符串类型 */
  6. #include"c7-2.h"
  7. #include"bo7-2.c"

  8. int count; /* 全局量count对访问计数 */
  9. int low[MAX_VERTEX_NUM];

  10. void DFSArticul(ALGraph G,int v0)
  11. { /* 从第v0个顶点出发深度优先遍历图G,查找并输出关节点。算法7.11 */
  12.    int min,w;
  13.    ArcNode *p;
  14.    visited[v0]=min=++count; /* v0是第count个访问的顶点 */
  15.    for(p=G.vertices[v0].firstarc;p;p=p->nextarc) /* 对v0的每个邻接顶点检查 */
  16.    {
  17.      w=p->adjvex; /* w为v0的邻接顶点 */
  18.      if(visited[w]==0) /* w未曾访问,是v0的孩子 */
  19.      {
  20.        DFSArticul(G,w); /* 返回前求得low[w] */
  21.        if(low[w]<min)
  22.          min=low[w];
  23.        if(low[w]>=visited[v0])
  24.          printf("%d %s\n",v0,G.vertices[v0].data); /* 关节点 */
  25.      }
  26.      else if(visited[w]<min)
  27.        min=visited[w]; /* w已访问,w是v0在生成树上的祖先 */
  28.    }
  29.    low[v0]=min;
  30. }

  31. void FindArticul(ALGraph G)
  32. { /* 连通图G以邻接表作存储结构,查找并输出G上全部关节点。算法7.10 */
  33.    /* 全局量count对访问计数。 */
  34.    int i,v;
  35.    ArcNode *p;
  36.    count=1;
  37.    low[0]=visited[0]=1; /* 设定邻接表上0号顶点为生成树的根 */
  38.    for(i=1;i<G.vexnum;++i)
  39.      visited[i]=0; /* 其余顶点尚未访问 */
  40.    p=G.vertices[0].firstarc;
  41.    v=p->adjvex;
  42.    DFSArticul(G,v); /* 从第v顶点出发深度优先查找关节点 */
  43.    if(count<G.vexnum) /* 生成树的根有至少两棵子树 */
  44.    {
  45.      printf("%d %s\n",0,G.vertices[0].data); /* 根是关节点,输出 */
  46.      while(p->nextarc)
  47.      {
  48.        p=p->nextarc;
  49.        v=p->adjvex;
  50.        if(visited[v]==0)
  51.          DFSArticul(G,v);
  52.      }
  53.    }
  54. }

  55. void main()
  56. {
  57.    int i;
  58.    ALGraph g;
  59.    printf("请选择无向图\n");
  60.    CreateGraph(&g);
  61.    printf("输出关节点:\n");
  62.    FindArticul(g);
  63.    printf(" i G.vertices[i].data visited[i] low[i]\n");
  64.    for(i=0;i<g.vexnum;++i)
  65.      printf("%2d %9s %14d %8d\n",i,g.vertices[i].data,visited[i],low[i]);
  66. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-5-12 00:26 , Processed in 0.028073 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表