算法基础复习题.ppt

4.16、给定一个带权有向图G和源点v0,用Dijkstra算法求从v0到G中其它顶点的最短路径的长度。设图G各边的权值大于0,图用邻接矩阵表示。引入数组S存放已求出最短路径的顶点集合,初始时,S只有源点。以后每求得一条路径,就将路径的终点加入到S中。直至全部顶点都在S中时,算法结束。 为了便于找到从源点v0到其他顶点的最短路径,另引入数组dist[]。它的元素dist[i]存储从源点v0到顶点vi的最短路径的长度。初始时,若从源点v0到顶点vi有边,则dist[i]即为该边的权值;若从源点v0到顶点vi没有边,则dist[i]为+?(99999) 。 #define MaxInt 99999 int ShortestPath(Mgraph *G, int v0, int dist[]) { int s[MaxVerticesNum]; int i, j, k, min; for(i = 0; i G-n; i++) { dist[i] = G-edges[v0][i]; ____(1)____; } s[v0] = 1; dist[v0] = 0; for(j = 0; j G-n-1; j++) {//循环n-1次 for(min = MaxInt, i = 0; i G-n; i++) if(____(2)____ dist[i]min) {//寻找下一条最短路径的终点k min = ____(3)____; k = i; } if(min == MaxInt) return -1; //不连通的图 s[k] = 1;// S ← S U { k }; for(i = 0; i G-n; i++) //修改dist[i],i ? V- S: if(____(4)____ G-edges[k][i]MaxInt ___(5)___ ) dist[i] = dist[k] + G-edges[k][i]; } return 0; } (1)s[i] = 0 (2)s[i] == 0 (3)dist[i] (4)s[i] == 0 (5)dist[i] dist[k] + G-edges[k][i]; 4.17、函数selectSort是采用选择排序法,对数组b [ ]中的n个元素按递增次序进行排序。 void selectSort ( int b [ ] , int n ) { int k , j , minIndex ; temp; for ( k = 0 ; k ___(1 )____ ; k++ ) { minIndex = k ; for (j = ___(2 )____ ; j ____(3 )____; j++ ) if ( b[j] b [ minIndex ] ) ____(4 )____ ; if ( ____(5 )____ ) { temp = b [ k ]; b [ k ] = e[ minIndex ] ; e [ minIndex ] = temp ; } } } n-1 (2) k+1 (3) n (4) minindex = j (5) k != minindex 4.18、函数unionSet ( DISJSETS *S1, DISJSETS *S2 ) 实现集合S1与S2的并,结果在S1中, 集合S1与S2用具有辅助结点的有序(从小到大)链表表示。类型为: typedef struct node { int ele ; struct node *next ; }EleNode ; // 链表表元类型 typedef struct{ EleNode *head ; //集合链表的首指针 } DISJSETS ; // 集合类型 void unionSet ( DISJSETS *S1 , DISJSETS *S2 ) { EleNode *p , *q , *t ; // t指向新的S1 *p = S1 – h

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档