如何判断一个有向图中是否含有环路?

本文详细介绍了拓扑排序算法的基本原理及其实现步骤。通过使用邻接表存储有向图,并结合栈来辅助处理,该算法能够有效地找出图中的顶点排序顺序。如果排序过程中发现无法继续,说明图中存在环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拓扑排序   
    
  (1)在有向图中选一个没有前驱的顶点且输出之   
  (2)从图中删除该顶点和所有以它为尾的弧。   
  重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止,后一种情况则说明有向图中存在环。   
    
  可采用邻接表作为有向图的存储结构。具体算法如下:   

[cpp]  view plain
  1. int   TopoSort(ALGraph   G)     
  2. {     
  3.         FindInDegree(G,indegree);         //对各顶点求入度     
  4.         InitStack(S);     
  5.         for(i=0;i<G.vexnum;++i)     
  6.                 if(!indegree[i])Push(S,i);       //入度为0者进栈     
  7.         count=0;     
  8.         while(!StackEmpty(S))     
  9.       {       
  10.               Pop(S,i);     
  11.               printf("i,G.vertices[i].data");     
  12.               ++count;     
  13.               for(p=G.vertices[i].firstarc;   p;   p=p->nextarc)     
  14.               {     
  15.                       k=p->adjvex;     
  16.                       if(!(--indegree[k]))Push(S,k);     //若入度减为0,则入栈     
  17.               }     
  18.         }     
  19.         if(count<G.vexnum)return   0;     //该有向图存在环     
  20.         else     
  21.                 return   1;     
  22. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值