详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)

2020-01-06 13:45:16王旭

按照Kruskal 方法构造最小生成树的过程如图所示:

详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)

 

在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选取了n-1 条边为止,就构成了一棵最小生成树。


Kruskal 算法的实现:
算法的框架:

构造非连通图T=(V,{})

k = i= 0;//k为边数

while(k《< n-1) {

i++;

检查边E中第i条边的权值

最小边(u,v)

若(u,v) 加入T不是T产生回路,

则(u,v)加入T,且k++

}

c语言实现:

C 语言实现Kruskal 算法,其中函数Find 的作用是寻找图中顶点所在树的根结点在数组father 中的序号。需说明的是,在程序中将顶点的数据类型定义成整型,而在实际应用中,可依据实际需要来设定。

?
  1. typedef int elemtype;   typedef struct {  
  2. elemtype v1;   elemtype v2;  
  3. int cost;   }EdgeType;  
  4. void Kruskal(EdgeType edges[ ],int n)   /*用Kruskal 方法构造有n 个顶点的图edges 的最小生成树*/ 
  5. { int father[MAXEDGE];   int i,j,vf1,vf2;  
  6. for (i=0;i<n;i++) father[i]=-1;   i=0;j=0;  
  7. while(i<MAXEDGE && j<n-1)   { vf1=Find(father,edges[i].v1);  
  8. vf2=Find(father,edges[i].v2);   if (vf1!=vf2)