拓扑排序的c语言实现

 

拓扑排序的c语言实现

标签: 语言matrixcini百度
  4703人阅读  评论(1)  收藏  举报
  分类:

以下的介绍是百度上的,因为这个实在太老了。但是只是单纯自己的一个程序显得不是很完整的。呵呵

 

  通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义:

  若集合X上的关系是R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。

  设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。

  注意:

  ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。

  ②若图中存在有向环,则不可能使顶点满足拓扑次序。

  ③一个DAG的拓扑序列通常表示某种方案切实可行。

实现的基本方法

 

  拓扑排序方法如下:

  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.

  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.

  (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.


[cpp]  view plain  copy
 print ?
  1. //本程序用的是邻接矩阵的方法计算拓扑排序的。   
  2. #include<stdio.h>  
  3. #define N 6//这是代表了 节点的个数   
  4. void Topologicalsort(int matrix[][N]);  
  5. //以下几个是简单的堆栈函数因为文中要用到。   
  6. void initstack(int*stack,int*n)  
  7. {  
  8.  for(int i=0;i<*n+1;i++)  
  9.     stack[i]=-1;  
  10.  *n=0;     
  11. }  
  12. void push(int*stack,int *n,int elem)  
  13. {  
  14.   stack[*n]=elem;  
  15.  (*n)++;       
  16. }  
  17. int pop(int*stack,int *n)  
  18. {  
  19.  int temp;  
  20.  (*n)--;  
  21.  temp=stack[*n] ;  
  22.  stack[*n]=-1;  
  23.  return temp;     
  24. }  
  25. int isempty(int*stack,int *n)  
  26. {  
  27.  if(*n)  
  28.        return 0;  
  29.        return 1;      
  30. }  
  31.   
  32. int main()  
  33. {  
  34.  int matrix[N][N]={{0,1,1,1,0,0},  
  35.                    {0,0,0,0,0,0},  
  36.                    {0,1,0,0,1,0},  
  37.                    {0,0,0,0,1,0},  
  38.                    {0,0,0,0,0,0},  
  39.                    {0,0,0,1,1,0}}; //初始化邻接矩阵。   
  40.  for(int i=0;i<N;i++){  
  41.          for(int j=0;j<N;j++)  
  42.                   printf(" %d ",matrix[i][j]);  
  43.                   printf("\n");}//打印矩阵   
  44.  Topologicalsort(matrix);  
  45.                     
  46.  getchar();            
  47.  return 0;  
  48. }  
  49. //拓扑排序函数   
  50. void Topologicalsort(int matrix[][N])  
  51. {  
  52.  int indegree[N]={0};//入度矩阵   
  53.  int sortorder[N]={0};//这是用于存放最后的拓扑排序 的序列   
  54.  int sortordercurse=0;  
  55.  int stack[N+1];  
  56.  int curse=N+1;  
  57.  initstack(stack,&curse);  
  58.  int count=0;//用来指示入度为0的顶点个数   
  59.  for(int j=0;j<N;j++){  
  60.          for(int i=0;i<N;i++)  
  61.                              indegree[j]+=matrix[i][j];  
  62.          if(!(indegree[j]))  
  63.                  push(stack,&curse,j); } //入度为0的顶点入栈     
  64.  while(!(isempty(stack,&curse)))  
  65.  {  
  66.   int tp;  
  67.   tp=pop(stack,&curse);  
  68.   sortorder[sortordercurse++]=tp;   
  69.   count++;  
  70.   for(int i=0;i<N;i++){  
  71.           if((indegree[i]==1)&&(matrix[tp][i]==1))  
  72.           push(stack,&curse,i);  
  73.           indegree[i]-=matrix[tp][i];}//对出栈的顶点所指向的顶点减一 ,并且将入度为0的顶点入栈。   
  74.  }  
  75.  if(count==N){  
  76.               printf("\n\nthe Topologicalsort is exist\nit's sort can be:");  
  77.               for(int i=0;i<sortordercurse;i++)  
  78.               printf(" V%d ",sortorder[i]+1);}  
  79.  else{  
  80.               printf("\n\nalert!!!\nthe Topologicalsort isnot exist\n");}  //判断是否是拓扑排序。             
  81.                
  82.     
  83.                      
  84. }  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值