数据结构实习三 图及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构

学院:

姓名:

班级:

学号:

实习三图及其应用

题目:试设计一个算法,求图中一个源点到其他各顶点的最短路径。

一.需求分析:

设计要求:

(1)用邻接表表示图;

(2)按长度非递减次序打印输出最短路径的长度及相应路径。

二.设计思想:

本程序使用链表的形式存储的。根据书上的德克斯德拉算法的思想,初始状态时,集合s中只包含源点,设为v0,然后不断地从集合T中选择到源点v0路径长度最短的结点u加入到集合s中,集合s中每加入一个新的结点u都要修改从源点v0到集合T中剩余结点的当前最短路径长度值,集合T中各结点的新的当前最短路径的长度值,为原来的最短路径的长度值与从源点过结点u到达该结点的路径长度中的最小者。此过程不断地重复,直到集合T中的结点全部加入到集合s中为止。

三.设计提示

题中规定采用邻接表表示图,假设图中有n个顶点,则考虑邻接表表头结点为head[0],head[1],head[2],…,head[n-1],链表中每个结点有

三个字段:

其中,vertex——顶点字段,存放顶点序号;

cost——表头顶点到该顶点之边上的权值;

link——连接同一链中的下一个顶点。

采用数组dist[j](0≤j≤n-1)存放从源点v0到顶点vj的最短路径长度,dist[0]=0,如果源点v0到顶点vx无通路,则dist[x]=max(计算机允许的最

大值)。

采用n-1个数组分别存放源点v0到其余n-1个顶点之最短路径上的顶点(序号)。采用数组S指示已找到最短路径的顶点。S[j]=0表示顶点j不在

数组中,S[j]=1表示顶点j在数组中(0≤j≤n-1)。

四.设计思想

构图比较简单。求最短路径是修改的书上的Dijkstra 函数,书上的图是用邻接矩阵存储的,我按照题目要求改为邻接链表,但是思想一样。排序借用了冒泡排序法。输出最短路径是自己设计的一个递归函数。函数体如下:

void Dijkstra(AdjLGraph G, int v0, int distance[], int path[]) /*带权图G 从下标v0顶点到其它顶点的最短距离distance*/ /*和最短路径下标path*/ { Edge *p;

int n=G.numOfVerts;

int *s = (int *)malloc(sizeof(int)*n); int minDis, i,j,u; /*初始化*/

for(i = 0; i < n; i ++)

构图 求最短路径

打印

输入点边信息

调用creatgraph

排序

输出(可用递归)

{ distance[i] =MaxWeight;

s[i] = 0;

path[i] = -1;

}

distance[v0]=0;

p=G.a[v0].adj;

while(p!=NULL)

{distance[p->dest]=p->cost;

path[p->dest]=G.a[v0].data;

p=p->next;

}

s[v0] = 1;

/*在还未找到最短路径的顶点集中选有最短距离的顶点u*/

for(i = 1; i < n; i ++)

{ minDis = MaxWeight;

for(j = 0;j <=n;j ++)

if(s[j] == 0 && distance[j] < minDis)

{ u = j; minDis = distance[j]; }

/*当已不再存在路径时算法结束*/

if(minDis == MaxWeight) return;

s[u] = 1; /*标记顶点u已从集合T加入到集合S中*/

/*修改从v0到其它顶点的最短距离和最短路径*/

p=G.a[u].adj;

while(p!=NULL)

{

if(s[p->dest] == 0 && distance[u] +p->cost < distance[p->dest])

{ distance[p->dest] = distance[u] +p->cost;

path[p->dest] =G.a[u].data;

}

p=p->next;

}

}

}

void printpath(int i,int start,int path[],int a[])

{

int j,u;

u=0;

if(path[i]==start) {printf("%d",start); return;}

for(j=0;j<6;j++)

{if(a[j]!=path[i])

{u++;}

if(a[j]!=path[i])break;

}

printpath(u,start,path,a); printf("%d",path[i]);

}

源代码:

#include

#include

typedef int DataType;

#define MaxSize 100

#define MaxVertices 10

#define MaxEdges 100

#define MaxWeight 10000

//********邻接表的存储结构***********

typedef struct Node

{ int cost;

int dest; /*邻接边的弧头顶点序号*/

struct Node *next;

}Edge; /*邻接边单链表的结点结构体*/

typedef struct

{

DataType data; /*顶点数据元素*/

int source; /*邻接边的弧尾顶点序号*/

Edge *adj; /*邻接边的头指针*/

} AdjLHeight; /*数组的数据元素类型结构体*/

typedef struct

{

AdjLHeight a[MaxVertices]; /*邻接表数组*/

int numOfVerts; /*顶点个数*/

int numOfEdges; /*边个数*/

} AdjLGraph;

/*邻接表结构体*/

typedef struct

{int row;

int col;

int weight;

}RowCol;

void AdjInitiate(AdjLGraph *G)

{int i;

相关文档
最新文档