拓扑排序

简介:        对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前       【例】对如上学生选课工程图进行拓扑排序, 得到的拓扑有序...

       img_bc66fdffd33007d83c7bbe7d83b85a9f.jpg

       对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前

      【例】对如上学生选课工程图进行拓扑排序, 得到的拓扑有序序列为

  C1 , C2 , C3 , C4 , C5 , C6 , C8 , C9 , C7

  或 C1 , C8 , C9 , C2 , C5 , C3 , C4 , C7 , C6

下面为拓扑排序的C代码

typedef struct Gnode{    /*邻接表的表节点类型*/
 int adjvex;     /*邻接顶点编号*/
 int weight;     /*弧上的权值*/ 
 struct Gnode *nextarc;    /*指示下一个弧的节点*/
}Gnode

typedef struct Adjlist {   /*邻接表的头节点类型*/
 char vdata;              /*顶点的数据信息*/
 struct Gnode *Firstadj;  /*指向下一个弧的第一个表节点*/
}Adjlist;

typedef struct LinkedWDigraph{    /*图的类型*/
 int n,e;                        /*图中顶点个数和边数*/
 struct Adjlist *head;      /*指向图中第一个顶点的邻接表的头节点*/
}LinkedWDigraph;

int Toplogical(LinkedWDigraph G)
{
 Gnode *p;
 int j,w,top=0;
 int *Stack,*ve,*indegree;
 ve=(int *)malloc((G.n+1)*sizeof(int));
 indegree=(int *)malloc((G.n+1)*sizeof(int));    /*存储网中各顶点的入度*/
 Stack=(int *)malloc((G.n+1)*sizeof(int));       /*存储入度为0的顶点的编号*/
 if (!ve || !indegree || !Stack) exit(0);
 for (j=1;j<=G.n;j++)  {
   ve[j]=0;  indegree[j]=0;
 }  /*for*/  
 for (j=1;j<=G.n;j++) {   /*求网中各顶点的入度*/
   p=G.head[j].Firstadj;
   while(p) {
      indegree[p->adjvex]++];   p=p->nextarc;
   }  /*while*/
 }
 
 for (j=1;j<G.n;j++)   /*求网中入度为0的顶点并保存其编号*/
  if (!indegree[j])  Stack[++top]=j;
  
 while (top>0) {
  w=Stack[top--];
  printf("%c   ",G.head[w].vdata);
  p=G.head[w].Firstadj;
  while (p){
   indegree[p->adjvex]--;
   if (!indegree[p->adjvex])
    Stack[++top]=p->adjvex;
   if (ve[p->adjvex<ve[w]+p->weight)
    ve[p->adjvex]=ve[w]+p->weight;
   p=p->nextarc;
  }
 }
 return ve[w];
}

相关文章
|
7月前
|
算法 测试技术 C++
【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠
【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠
|
7月前
拓扑排序
拓扑排序
46 0
|
7月前
|
存储 人工智能 算法
【算法总结】拓扑排序
【算法总结】拓扑排序
73 0
|
搜索推荐
|
人工智能 自然语言处理 搜索推荐
拓扑排序算法
拓扑排序算法
136 0
|
存储 算法 Java
【数据结构与算法】有向图的拓扑排序
【数据结构与算法】有向图的拓扑排序
213 1
【数据结构与算法】有向图的拓扑排序
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
197 0
拓扑排序(邻接表实现)
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
拓扑排序-Kitchen Plates
J. Kitchen Plates time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output
125 0
拓扑排序-Kitchen Plates