第十二周项目4 利用遍历思想求解图问题(6)

来源:互联网 发布:眼镜数据 编辑:程序博客网 时间:2024/05/22 10:36

问题及代码:

/* 02.* Copyright (c)2016,烟台大学计算机与控制工程学院 03.* All rights reserved. 04.* 文件名称:zhou.cpp 05.* 作    者:吕方舟 06.* 完成日期:2016年11月27日 07.* 版 本 号:v1.0 08.* 问题描述:求不带权连通图G中从顶点u到顶点v的一条最短路径。 09.*/  10.#include <stdio.h>  11.#include <malloc.h>  12.#include "graph.h"  13.  14.typedef struct  15.{  16.    int data;                   //顶点编号  17.    int parent;                 //前一个顶点的位置  18.} QUERE;                        //非环形队列类型  19.  20.void ShortPath(ALGraph *G,int u,int v)  21.{  22.    //输出从顶点u到顶点v的最短逆路径  23.    ArcNode *p;  24.    int w,i;  25.    QUERE qu[MAXV];             //非环形队列  26.    int front=-1,rear=-1;       //队列的头、尾指针  27.    int visited[MAXV];  28.    for (i=0; i<G->n; i++)      //访问标记置初值0  29.        visited[i]=0;  30.    rear++;                     //顶点u进队  31.    qu[rear].data=u;  32.    qu[rear].parent=-1;  33.    visited[u]=1;  34.    while (front!=rear)         //队不空循环  35.    {  36.        front++;                //出队顶点w  37.        w=qu[front].data;  38.        if (w==v)               //找到v时输出路径之逆并退出  39.        {  40.            i=front;            //通过队列输出逆路径  41.            while (qu[i].parent!=-1)  42.            {  43.                printf("%2d ",qu[i].data);  44.                i=qu[i].parent;  45.            }  46.            printf("%2d\n",qu[i].data);  47.            break;  48.        }  49.        p=G->adjlist[w].firstarc;   //找w的第一个邻接点  50.        while (p!=NULL)  51.        {  52.            if (visited[p->adjvex]==0)  53.            {  54.                visited[p->adjvex]=1;  55.                rear++;             //将w的未访问过的邻接点进队  56.                qu[rear].data=p->adjvex;  57.                qu[rear].parent=front;  58.            }  59.            p=p->nextarc;           //找w的下一个邻接点  60.        }  61.    }  62.}  63.  64.int main()  65.{  66.    ALGraph *G;  67.    int A[9][9]=  68.    {  69.        {0,1,1,0,0,0,0,0,0},  70.        {0,0,0,1,1,0,0,0,0},  71.        {0,0,0,0,1,1,0,0,0},  72.        {0,0,0,0,0,0,1,0,0},  73.        {0,0,0,0,0,1,1,0,0},  74.        {0,0,0,0,0,0,0,1,0},  75.        {0,0,0,0,0,0,0,1,1},  76.        {0,0,0,0,0,0,0,0,1},  77.        {0,0,0,0,0,0,0,0,0}  78.    };  //请画出对应的有向图  79.    ArrayToList(A[0], 9, G);  80.    ShortPath(G,0,7);  81.    return 0;  82.}  

运行结果:

知识点总结:求不带权连通图中两顶点间的一条最短路径。

学习心得:由于要用队列记录访问的顺序,找出路径,所以采用非环形队列,这里用到的是广度优先的算法。


0 0
原创粉丝点击