- 61
- 0
- 约2.1万字
- 约 66页
- 2016-12-26 发布于广东
- 举报
int MinValue(int n) {//比较求最小距离值,并返回对应下标 int j,k; for(j=0;jn;j++) if(CloseEdge[j].lowcost0) { k=j;break; } for(j=1;jn;j++) if(CloseEdge[j].lowcost0CloseEdge[j].lowcost CloseEdge[k]. lowcost) k=j; return k; } 引例分析与实现 void Prim (MGraph *G,int u) {//求用邻接矩阵表示的图G的最小生成树的算法 int cc=0,pp[VertexNum*2]; /*pp记录最小生成树中边的下标,最终得到最小生成树的边的序列*/ int k=0,i,j,s1; for(i=0;iG-n;i++) { CloseEdge[i].vex=u; CloseEdge[i].lowcost=G-edges[u][i]; } CloseEdge[u].lowcost=0; for(i=1;iG-n;i++) //求最小生成树的G-n-1条边 { k=MinValue(G-n); s1=CloseEdge[k].vex; //边(s1,k)是一条权值最小的边 CloseEdge[k].lowcost=0; //将顶点k加入到U中 pp[cc++]=s1; pp[cc++]=k; //将最小生成树的一条边(s1,k)记录到数组pp中 for(j=0;jG-n;j++) if(G-edges[k][j]CloseEdge[j].lowcost) {//调整最短路径,并保存下标 CloseEdge[j].lowcost=G-edges[k][j];CloseEdge[j].vex=k; } } printf(公路网建设最经济方案为:\n); for(i=0;i2*(G-n-1);i=i+2) printf(应建公路:%s=%s,费用:%d\n,G-vexs[pp[i]], G-vexs[pp[i+1]],G-edges[pp[i]][pp[i+1]]); } 引例分析与实现 int main() { MGraph G; CreateMGraph(G); Prim (G,0); //0为起始顶点的下标 return 0; } 引例分析与实现 再 见 * 3.广度优先遍历的递归算法(BFS算法) (1)邻接矩阵表示的广度优先遍历算法 int visited[VertexNum]={0}; //定义标志向量 void BFSM(MGraph *G,int k) {//以vk为源点对用邻接矩阵表示的图G进行广度优先搜索 int i,j; CirQueue Q; InitQueue(Q); printf(%4c,G-vexs[k]);//访问源点vk visited[k]=1; EnQueue(Q,k); while(!QueueEmpty(Q)) { i=DeQueue(Q); //vi出队 for(j=0;jG-n;j++)//依次搜索vi的邻接点vj if(G-edges[i][j]==1!visited[j]) {//vi未访问 printf(%4c,G-vexs[j]);//访问vi visited[j]=1; EnQueue(Q,j);//访问过的vi入队 } } } void DFSTraverse(MGraph *G) {//广度优先遍历以邻接矩阵表示G int i; for(i=0;iG-n;i++) visited[i]=0; //标志向量初始化 for(i=0;iG-n;i++) if(!visited[i])//vi未访问过 BFSM(G,i); //以vi为源点开始DFSM搜索 } (2)邻接表表示的广度优先遍历算法 int visited[VertexNum]={0}; //定义标志向量 void BFS(ALGraph*G,int k) {// 以vk为源点对用邻接表表示的图G进行广度优先搜索 int i; CirQueue Q;//须将队列定义中DataType改为int EdgeNode *p; InitQueue(Q);//队列初始化 printf(%4c,G-adjlist[k].vertex); //访问源点vk visited[k]=1; EnQueue(Q,k); //vk已访问,将其入队。(实际上是将其序号入队) while(!QueueEmpt
原创力文档

文档评论(0)