求图的最短路径

mostion 2008-06-04 01:36:13
1、建立a到b权为5,b到a权为10 b到d权为1,b到c权为6 c到a权为3 c到d权为4,d到c权为2,d到b权为8的图 (是有向图来的,a到b表示a指向b)
2、求出指定起点(由键盘输入)到终点(指定)的最短路径;
[基本要求]
1、采用邻接矩阵为存储结构;
2、有较好的交互界面完成输入(如起点的指定)和输出;
3、输出的最短路径应该包括2方面内容:首先,最短路径长度是多少;其次,该最短路径经过了哪些顶点。
希望各位朋友能帮忙,不胜感激!
...全文
686 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
laolaoliu2002 2008-06-04
  • 打赏
  • 举报
回复
给定一个(无向)图G,及G中的两点s、t,确定一条从s到t的最短路径。 

输入图G的顶点数n。接下来的n行描述这一个图形,采用邻接表方式,其中的第i行有n个数,依次表示第i个顶点与第1、2、3、…、n个顶点的路径长。假如两个顶点间无边相连,用一个大数maxint(如65535)表示。再在下面的一行上给出两个整数i、j表示要求最短距离的两个顶点i和顶点j。
输出两个顶点i和顶点j的最短距离,同时给出最短路径上的顶点序列。
注意:每行上的两个相邻数间用一个空格隔开。

实验结果:
输入
4
0 2 65535 4
2 0 3 65535
65535 3 0 2
4 65535 2 0
1 3

输出
The least distance from l to 3 is 5.
The path is 1-> 2-> 3

程序代码:

#include <iostream>
#include <cstdlib>
using namespace std;

void Dijkstra(int n,int v,int dist[],int prev[],int **c)
{
int maxint = 65535;
bool *s = new bool[n];
for (int i = 1; i <= n; i++)
{
dist[i] = c[v][i];
s[i] = false;
if (dist[i] == maxint)
{
prev[i] = 0;
}
else
{
prev[i] = v;
}
}
dist[v] = 0;
s[v] = true;
for (int i = 1; i < n; i++)
{
int temp = maxint;
int u = v;
for (int j = 1; j <= n; j++)
{
if ((!s[j]) && (dist[j] < temp))
{
u = j;
temp = dist[j];
}
}
s[u] = true;
for (int j = 1; j <= n; j++)
{
if ((!s[j]) && (c[u][j] < maxint))
{
int newdist = dist[u] + c[u][j];
if (newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}

int main()
{
int n,v,u;
int q = 0;
cout < <"输入顶点数:";
cin>>n;
int *way = new int[n + 1];
int **c = new int *[n + 1];
for (int i = 1; i <= n; i++)
{
c[i] = new int[n + 1];
}
cout < <"输入顶点的邻接矩阵:";
for (int j = 1; j <= n; j++)
{
for (int t = 1; t <= n; t++)
{
cin>>c[j][t];
}
}
int *dist = new int [n];
int *prev = new int [n];
cout < <"输入出发点和到达点:";
cin>>v>>u;
Dijkstra(n, v, dist, prev, c);
cout < <"最短路径从" < <v < <" -> " < <u < <" 的距离是:" < <dist[u] < <endl;
int w = u;
while (w != v)
{
q++;
way[q] = prev[w];
w = prev[w];
}
cout < <"路径为:";
for (int j = q; j >= 1; j--)
{
cout < <way[j] < <" ->";
}
cout < <u < <endl;

delete []way; way=NULL;
for (int i = 1; i <= n; i++) delete []c[i];
delete []c;
c=NULL;
delete []dist; dist=NULL;
delete []prev; prev=NULL;
system("pause");
return 0;
}

程序分析:
a[i][j]记边(i,j)的权,数组dist[u]记从源v到顶点u所对应的最短特殊路径长度
算法描述如下:
S1:初始化,S, T,对每个yS,{dist[y]=a[v][y],prev[y]=nil}
S2:若S=V,则输出dist,prev,结束
S3:uV\S中有最小dist值的点,SS{u}
S4:对u的每个相邻顶点x,调整dist[x]:即
若dist[x]>dist[u]+a[u][x],则{dist[x]=dist[u]+a[u][x],prev[x]=u},转S2

对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n)时间。这个循环需要执行n-1次,所以完成循环需要O(n2)时间。算法的其余部分所需要时间不超过O(n2)
laolaoliu2002 2008-06-04
  • 打赏
  • 举报
回复
http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.1.1.htm
yclz 2008-06-04
  • 打赏
  • 举报
回复
作业帖要收钱,呵呵.
icansaymyabc 2008-06-04
  • 打赏
  • 举报
回复
又见作业题。

怎么现在的学生都不会做作业了?

看来这个下面这个逻辑等式是成立的了:

越幸福的童年 => 更迷惘的青年
des2006 2008-06-04
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080603/22/ca7e8467-c31c-4df5-a9c4-d9184c01ddd7.html

双号??

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧