拓扑排序

两种思路

a、找到图中入度为零的顶点,并输出

b、删除该顶点,并修改其他顶点的入度

c、如果还有入度为零的顶点,则转a,否则输出

a、进行深度优先搜索

b、按finish time反序排列,即为拓扑序列

 

solution1
 1 int Is_ZeroDegree(int* a,int n)
2 {
3 for(int i=0;i<n;++i)
4 if(a[i]==0)
5 return i;
6 return n;
7 }
8
9 void Topo_Sort1(const Graph* g)
10 {
11 int indegree[50];
12 for(int i=0;i<g->v;++i)
13 indegree[i]=0;
14 for(int i=0;i<g->v;++i)
15 {
16 Vertex vtx=g->vertices[i];
17 Edge* link=vtx.head;
18 while(link!=NULL)
19 {
20 indegree[link->adj_vertex-1]++;
21 link=link->next;
22 }
23 }
24 int m;
25 int num=g->v;
26 while((m=Is_ZeroDegree(indegree,g->v))!=g->v&&num>0)
27 {
28 cout <<"Visit Vertex "<<m+1<<" ";
29 num--;
30 indegree[m]=999;
31 Edge* tmp=g->vertices[m].head;
32 while(tmp!=NULL)
33 {
34 indegree[tmp->adj_vertex-1]--;
35 tmp=tmp->next;
36 }
37 }
38 if(num>0)
39 cout <<"This is not DAG!";
40 }

 

posted @ 2012-02-21 15:39  Cavia  阅读(202)  评论(0编辑  收藏  举报