算法实现
MSTEdge *Kruskal MST(ELGraph *G)
/*用Kruskal算法构造图G的最小生成树*/
{ MSTEdge TE[ ;
int j, k, V, s1, s2, Vset[] ;
WeightType w ;
Vset=(int *)malloc(G->vexnum *sizeof(int)) ;
for (=0; j<G->vexnum; j++)
Vset[j]=j ; /* 初始化数组Vset[n] */
sort(G->edgelist); /* 对表按权值从小到大排序*/
j=0 ;k=0;
while (k<G->vexnum-1 &&j< G->edgenum)
{ s1=Vset[G->edgelist[j].vex1];
s2= Vset[G->edgelist[j].vex2] ;
/*若边的两个顶点的连通分量编号不同,边加入到TE中*/
if (s1!=s2)
{ TE[k].vex 1=G->edgelist[j].vex1 ;
TE[k].vex2=G->edgelist[j].vex2 ;
TE[k].weight=G->edgelis t[j].weight;
for (v=0; v<G->vexnum; v++)
if (Vset[v]= =s2) Vset[v]=s1 ;
}
j++ ;
}
free(Vset) ;
return(TE) ;}
/*求最小生成树的Kruskal算法*/

void count indegree(ALGraph *G)
{ int k ;
LinkNode *p ;
for (k=0; k<G->vexnum; k++)
G-> adjlist[kJ.indegree=0; /*顶点入度初始化*/
for (k=0; k<G->vexnum; k++)
{ p=G-> adjlist[k].firstarc ;
while (p!=NULL)/*顶点入度统计*/
{ G->adjlist[p->adjvex].indegree++ ;
p=p-> nextarc ;
}
}
}
(2)拓扑排序算法
int Topologic Sort(ALGraph *G, int topol[)
/*顶点的拓扑序列保存在一维数组topol中 */
{ int k, no, vex_ no, top=0, count =0,boolean=1 ;
int stack[MAX_ VEX] ; /*用作堆栈*/
LinkNode *p ;
count_ indegree(G); /* 统计各顶点的入度*/
for (k=0; k<G->vexnum; k++)
if (G->adjJist[k].indegree--0)
stack[+ +top]=G-> adjlist[k].data ;
do{if(top==0) boolean=0 ;
else
{ no=stack[top-] ;/*栈顶元素出栈*/
topl[++count]=no; /* 记录顶点序列*/
p=G-> adjlist[no].firstarc ;
while (p!=NULL) /* 删除以顶点为尾的弧*/
{ vex_ no=p->adjvex ;
G-> adjlist[vex no]indegree--;
if (G->adjlist[vex no].indegree==0)
stack[++top]=vex_ no ;
p=p-> nextarc ;
}
}
}while(boolean==0) ;
if (count<G->vexnum) return(-1) ;
else return(1);
}
void critical path(ALGraph *G)
{ int j,k,m; LinkNode *p ;
if (Topologic_Sort(G)==-1)
printf(“\nAOE网中存在回路,错误!!\n\n”) ;
else
{ for( j=0; j<G->vexnum; j++)
ve[j]=0 ;/*事件最早发生时间初始化*/
for (m=0; m<G->vexnum; m++)
{ j=topol[m] ;
p=G-> adjlist[j].firstarc ;
for(; p!=NULL; p=p->nextarc )
{ k=p->adjvex ;
if (ve[j]+p->weight>ve[k)
ve[k]=vel[jl+p->weight;
}
} /*计算每个事件的最早发生时间ve值*/
for ( j=0; j<G->vexnum; j++)
vI[j]=ve[j] ; /* 事件最晚发生时间初始化*/
for (m=G->vexnum-1; m>=0; m--)
{ j=topol[m] ; p=G->adjlistijJ.firstarc;
for (; p!=NULL; p=p->nextarc )
{ k=p->adjvex ;
if (vI[k]-p->weight<vI[j)
vI[i]=vl[k]-p->weight ;
}
} /*计算每个事件的最晚发生时间vI值*/
for (m=0; m<G->vexnum; m++)
{ p=G->adjlist[m].firstarc ;
for (; p!=NULL; p=p->nextarc )
{ k=p->adjvex ;
if ( (ve[m]+p->weight=VI[k])
printf(“<%d, %d>, m,j");
}
}/*输出所有的关键活动*/
}/* end ofelse */
}
(1)分析并回答下列问题:
①图中顶点的度之和与边数之和的关系?
②有向图中顶点的入度之和与出度之和的关系?
③具有n个顶点的无向图,至少应有多少条边才能确保是一个连通图?若采用邻接矩阵表示,则该矩阵的大小是多少?
④具有n个顶点的有向图,至少应有多少条孤才能确保是强连通图的?为什么?
(2) 设有向图G=(V,E), 其中V= {a,b,c,d,e}, E={, , ,
①请画出该有向图,并求各顶点的入度和出度。
②分别画出有向图的正邻接链表和逆邻接链表。
(3)对图7-27所示的带权无向图。、
①写出相应的邻接矩阵表示。
②写出相应的边表表示。
③求出各顶点的度。
(4)已知有向图的逆邻接链表如图7-28所示。
①画出该有向图。
②写出相应的邻接矩阵表示。
③写出从顶点a开始的深度优先和广度优先遍历序列。
④画出从顶点a开始的深度优先和广度优先生成树
(5)一个带权连通图的最小生成树是否唯一?在什么情况下可能不唯一?
(6)对于图7-27所示的带权无向图。
①按照Prime算法给出从项点2开始构造最小生成树的过程。
②按照Kruskal算法给出最小生成树的过程。
(7)已知带权有向图如图7-29所示,请利用Dijkstra算法从顶点V.出发到其余顶点的最短路径及长度,给出相应的求解步骤。
(8)已知带权有向图如图7-30所示,请利用Floyd算法求出每对顶点之间的最短路径及路径长度。
(9)一个AOV网用邻接矩阵表示,如图7-31。 用拓扑排序求该A0V网的一个拓扑序列,给出相应的步骤。
(10)拓扑排序的结果不是唯一的,请给出如图7-32所示的有向图的所有可能的拓扑序列。
(11)请在深度优先搜索算法的基础上设计一个对有向无环图进行拓扑排序的算法。
(12)设计一个算法利用图的遍历方法输出一个无向图G中从顶点V:到V的长度为S的简单路径,设图采用邻接链表作为存储结构。
(13)假设一个工程的进度计划用AOE网表示,如图7-33所示。
①求出每个事件的最早发生时间和最晚发生时间。
②该工程完工至少需要多少时间?
③求出所有关键路径和关键活动。

