如上图,为一有向图,想在要对其进行拓扑排序,算法可以参考: http://zh.wikipedia.org/wiki/%E6%8B%93%E6%92%B2%E6%8E%92%E5%BA%8F 代码如下: #define N 7 //图的节点数 #define DELETE -1024 //获得入度为0的节点 int GetZeroIndegreeNode(int (*graph)[N]) { for (int i = 0; i<N; i++) { int sum = 0; for (int j =0; j<N; j++) //对第i列第j行的元素进行计算 sum += graph[j][i]; if(sum == 0) //若sum为0,表示节点i的入度为0 return i; } return -1; //返回-1表示没有入度为0的节点 } //将节点i删除,并将该节点出度的边删除 void DeleteNodeAndEdge(int (*graph)[N], int i) { for (int j = 0; j<N; j++) //删除点i为出度的边 { if(graph[i][j] == 1) graph[i][j] = 0; } for (int j = 0; j<N; j++)//删除点i graph[j][i] = DELETE; } //拓扑排序 void TopologicalSort(int (*graph)[N]) { int node; while ((node = GetZeroIndegreeNode(graph)) != -1) { cout<<"V"<<node+1<<" "; DeleteNodeAndEdge(graph, node); } cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { int adjMatrix[N][N] = { //邻接矩阵来表示有向图 {0, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 1}, {0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0}, }; TopologicalSort(adjMatrix); return 0; } 2、采用邻接链表的方式 // TopologicalSort.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <list> #include <deque> using namespace std; #define N 7 //图的顶点数 struct Vertex { int element; list<int> l; //存放点element的邻接点的链表 }; struct Graph { Vertex arr[N]; //图的邻接链表表示 }; //创建图 void CreateGraph(Graph &graph) { int m; int k; for (int i = 0; i < N; i++) { printf("输入%d节点的出度: ", i+1); cin>>m; cout<<i+1<<" -> "; for (int j = 0; j<m; j++) { cin>>k; graph.arr[i].l.push_back(k); } cout<<endl; } } //拓扑排序 void TopologicalSort(Graph graph) { int zeroIndegree[N] = {0}; list<int>::iterator iter; for (int i=0; i<N; i++) //构造没个结点的入读数组,因为有N个节点所以复杂度为O(N) { iter = graph.arr[i].l.begin(); while (iter != graph.arr[i].l.end()) { zeroIndegree[*iter-1]++; iter++; } } deque<int> d; for (int i = 0; i<N; i++) if(0 == zeroIndegree[i]) //将入读为0的点放入队列 d.push_back(i+1); while(!d.empty()) { int del = d.front(); cout<<del<<" "; d.pop_front(); iter = graph.arr[del-1].l.begin(); while (iter != graph.arr[del-1].l.end())//删除边,共有E条边,所以复杂度为O(E) { if(--zeroIndegree[*iter-1] == 0) d.push_back(*iter); iter++; } } cout<<endl; } //如采用邻接链表的方式来表示图,该排序算法的复杂度为O(N+E). int _tmain(int argc, _TCHAR* argv[]) { Graph graph; CreateGraph(graph); TopologicalSort(graph); return 0; }