⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 拓扑序列.cpp

📁 图论的代码
💻 CPP
字号:
 // algo7-4.cpp 输出有向图的一个拓扑序列。实现算法7.12的程序
 #include"c1.h"
 #define MAX_NAME 5 // 顶点字符串的最大长度
 typedef int InfoType;
 typedef char VertexType[MAX_NAME]; // 字符串类型
 #include"c7-2.h"
 #include"bo7-2.cpp"

 void FindInDegree(ALGraph G,int indegree[])
 { // 求顶点的入度,算法7.12、7.13调用
   int i;
   ArcNode *p;
   for(i=0;i<G.vexnum;i++)
     indegree[i]=0; // 赋初值
   for(i=0;i<G.vexnum;i++)
   {
     p=G.vertices[i].firstarc;
     while(p)
     {
       indegree[p->adjvex]++;
       p=p->nextarc;
     }
   }
 }

 typedef int SElemType; // 栈类型
 #include"c3-1.h"
 #include"bo3-1.cpp"
 Status TopologicalSort(ALGraph G)
 { // 有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,
   // 否则返回ERROR。算法7.12
   int i,k,count,indegree[MAX_VERTEX_NUM];
   SqStack S;
   ArcNode *p;
   FindInDegree(G,indegree); // 对各顶点求入度indegree[0..vernum-1]
   InitStack(S); // 初始化栈
   for(i=0;i<G.vexnum;++i) // 建零入度顶点栈S
     if(!indegree[i])
       Push(S,i); // 入度为0者进栈
   count=0; // 对输出顶点计数
   while(!StackEmpty(S))
   { // 栈不空
     Pop(S,i);
     printf("%s ",G.vertices[i].data); // 输出i号顶点并计数
     ++count;
     for(p=G.vertices[i].firstarc;p;p=p->nextarc)
     { // 对i号顶点的每个邻接点的入度减1
       k=p->adjvex;
       if(!(--indegree[k])) // 若入度减为0,则入栈
         Push(S,k);
     }
   }
   if(count<G.vexnum)
   {
     printf("此有向图有回路\n");
     return ERROR;
   }
   else
   {
     printf("为一个拓扑序列。\n");
     return OK;
   }
 }

 void main()
 {
   ALGraph f;
   printf("请选择有向图\n");
   CreateGraph(f);
   Display(f);
   TopologicalSort(f);
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -