拓扑排序
方法:
①找出一个入度为0的顶点,输出(作为序列的一个元素)
②删除顶点v及其牺牲你关掉的弧,(因而后继定点的入度为1,并可能出现新的入度为0的顶点)
③重复上述步骤①②,直到找不到入度为0的顶点为止。
(拓扑序列不唯一)
1 #include "iostream" 2 #include "stack" 3 using namespace std; 4 5 const int MaxNumVertex = 20; //最大顶点数 6 const int infinity = 65535;//无穷大 7 typedef int elementtype; //elementtype 为int 型 8 class graph{ 9 public: 10 graph(); 11 ~graph(); 12 elementtype insertvertex(elementtype v); //在图中增加一个顶点 13 elementtype insertedge(elementtype v,elementtype u);//在图中增加一条从v顶点到u顶点的弧 14 elementtype firstadj(elementtype v);//求图g中顶点v的第一个邻接点 15 elementtype nextadj(elementtype v,elementtype m);//求图中顶点v的m邻接点之后的邻接点 16 elementtype degree(elementtype v);//求图中顶点v的度数 17 bool ToplogicalSort();//拓扑排序 18 elementtype FindDegree(elementtype ind[]);//各顶点的入读存放于入度数组中 19 elementtype create();//创建图 20 int CurrentVertex;//当前顶点数 21 22 private: 23 elementtype vertex[MaxNumVertex];//顶点表 24 elementtype edge[MaxNumVertex][MaxNumVertex];//图中弧的类型 25 26 }; 27 28 /* 29 *初始化 30 */ 31 graph::graph() 32 { 33 CurrentVertex = 0; 34 int i,j; 35 for (i=MaxNumVertex-1;i>=1;i--) 36 { 37 for (j=MaxNumVertex-1;j>=1;j--) 38 { 39 edge[i][j] = 0; 40 41 } 42 } 43 44 } 45 46 /* 47 *在图中增加一个顶点 48 */ 49 elementtype graph::insertvertex(elementtype v) 50 { 51 //判断这个顶点是否已经存在 52 int i; 53 bool flags = true; 54 for(i=1; i<=CurrentVertex; i++) 55 { 56 if(vertex[i]==v) 57 { 58 flags = false; 59 break; 60 } 61 } 62 63 if(flags) 64 { 65 CurrentVertex++; 66 vertex[CurrentVertex] = v; 67 }else{ 68 cout<<<"顶点已经存在!"< "< <<"这条弧弧已经存在!"<