关节点

 
  1. #include<iostream>
  2. #include<stdlib.h>
  3. using namespace std;
  4. #define OK 1
  5. #define OVERFLOW -2
  6. typedef int Status;
  7. typedef char VertexType;
  8. typedef enum{DG,DN,UDG,UDM} GraphKind;
  9. typedef struct ArcNode{
  10.         int adjvex;
  11.         struct ArcNode *nextarc;
  12.         }ArcNode;
  13. typedef struct VNode{
  14.        VertexType data;
  15.        ArcNode *firstarc; 
  16.        }VNode,*AdjList;
  17. typedef struct {
  18.         AdjList vertices;
  19.         int vexnum,arcnum;
  20.         GraphKind kind;
  21.         }ALGraph;
  22. int const N=100;
  23. int visited[N],low[N];
  24. int LocateVex(ALGraph G,VertexType v)
  25. {
  26.     for(int i=0;i<G.vexnum;i++)
  27.             if(G.vertices[i].data==v) return i;
  28.     return G.vexnum;}
  29.     
  30. Status  CreateUDG(ALGraph &G)
  31. {
  32.         G.kind=UDG;               //无向图 
  33.         cin>>G.vexnum>>G.arcnum;
  34.         if(!(G.vertices=new VNode[G.vexnum])) exit(OVERFLOW);
  35.         for(int i=0;i<G.vexnum;i++) {
  36.                 cin>>G.vertices[i].data;
  37.                 G.vertices[i].firstarc=NULL;}
  38.         VertexType v1,v2;
  39.         ArcNode *p,*q;
  40.         int i,j,k=0;
  41.         for(;k<G.arcnum;k++) {
  42.                 do
  43.                 {
  44.                       cin>>v1>>v2;
  45.                       i=LocateVex(G,v1);
  46.                       j=LocateVex(G,v2);
  47.                       }while(i==G.vexnum||j==G.vexnum);
  48.                 p=new ArcNode;
  49.                 q=new ArcNode;
  50.                 if(!p||!q) exit(OVERFLOW); 
  51.                 p->adjvex=j;
  52.                 p->nextarc=G.vertices[i].firstarc;
  53.                 G.vertices[i].firstarc=p;
  54.                 q->adjvex=i;
  55.                 q->nextarc=G.vertices[j].firstarc;
  56.                 G.vertices[j].firstarc=q;
  57.           }
  58.         return OK;
  59. }
  60. void FindArticul(ALGraph G,int u,int parent)
  61. {
  62.  static int idx=0;
  63.  int child_cnt=0;
  64.  bool flag=false;
  65.  visited[u]=++idx;
  66.  low[u]=visited[u];
  67.  for(ArcNode *p=G.vertices[u].firstarc;p;p=p->nextarc)
  68.  {
  69.         if(visited[p->adjvex]==-1)   //未访问 
  70.         {
  71.               FindArticul(G,p->adjvex,u);   //DFS遍历 
  72.               if(low[p->adjvex]<low[u]) low[u]=low[p->adjvex];  //low[u]取DFS子树最小 
  73.               else if(low[p->adjvex]>=visited[u])
  74.                       flag=true;  //u是关节点 
  75.               ++child_cnt;   //u节点子树个数 
  76.         }
  77.         else if(p->adjvex!=parent&&visited[p->adjvex]<low[u])
  78.                 low[u]=visited[p->adjvex];     
  79.  }
  80.  if (parent!=-1&&flag||parent==-1&&child_cnt>=2)  
  81.         cout<<G.vertices[u].data<<" ";
  82.  }
  83.                               
  84. int main(){
  85.     ALGraph G;
  86.     CreateUDG(G);
  87.     for(int i=0;i<N;i++)
  88.         visited[i]=-1;
  89.     FindArticul(G,0,-1);
  90.     system("pause");
  91.     return 0;} 
  92. 输入
  93. 13 17
  94. a b c d e f g h i j k l m
  95. a b
  96. a c
  97. a f
  98. a l
  99. b c
  100. b d
  101. b g
  102. b h
  103. b m
  104. d e
  105. g h
  106. g i
  107. g k
  108. h k
  109. j l
  110. j m
  111. l m
  112. 输出
  113. g d b a 请按任意键继续. . .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值