您的位置:首页 > 其它

dijkstra算法--求两点之的最短路径

2016-04-13 14:38 501 查看
# include <stdio.h>

# define MAX 20

int creat_cost(int cost[][MAX])		//cost 用来表示图的邻接矩阵
{
int arcnum,vexnum,v1,v2,w;
printf ("请输入顶点个数和弧数\n");		//输入图的顶点数和弧数
scanf ("%d %d",&vexnum,&arcnum);
for (int i=1; i<=vexnum; ++i)
{
for (int j=1; j<=vexnum; ++j)
{
cost[i][j] = 9999;		//假设9999为无限大
}
}
for (int k=1; k<=arcnum; ++k)
{
printf ("请输入两个顶点以及之间的距离\n")
printf ("v1,v2,w = ");			//输入所有边的一对顶点v1,v2,以及弧长
scanf (" %d %d %d",&v1,&v2,&w);		//并且根据输入数据建立邻接矩阵
cost[v1][v2] = w;
}

return vexnum;
}

void dijkstra(int cost[][MAX],int vexnum)		//dijkstra算法 求最短路径
{
int path[MAX],s[MAX],dist[MAX],i,j,n,w,v,sum,min,v1;/*	s数组记录顶点v是否已经确定了最短路径
s[v]=1, 顶点v已经确定了最短路径
s[v]=0,顶点v还没有确定最短路径
dist数组表示当前求出的从v1到v2的最短路径
path是路径数组,path[i]表示源点到顶点vi之间最短路径上vi的前驱顶点
*/
printf ("输入源点\n");
scanf (" %d",&v1);				//输入源点v1
for (i=1; i<=vexnum; ++i)
{
dist[i] = cost[v1][i];
s[i] = 0;
if (cost[v1][i] < 9999)		//记录当前最短路径
path[i] = v1;
}
s[v1] = 1;		//将源点加入s数组中
for (i=1; i<=vexnum; ++i)
{
min = 9999;
for (j=1; j<=vexnum; ++j)		//从s数组外找出距离源点最近的顶点w
{
if ((s[j] == 0)&&(dist[j]<min))
{
min = dist[j];
w = j;
}
}
s[w] = 1;
for (v=1; v<=vexnum; ++v)
{
if (s[v] == 0)
{
if (dist[w]+cost[w][v] < dist[v])
{
dist[v] = dist[w]+cost[w][v];		//修改v-s集合中各顶点的最短路径长度
path[v] = w;
}
}
}
}
printf ("从源点 %d  开始的最短路径\n",v1);
for (i=1; i<=vexnum; ++i)
997f

{
if (s[i] == 1)
{
w = i;
while(w != v1)
{
printf ("%d <--",w);
w = path[w];
}
printf ("%d  ",w);
printf ("		%d\n",dist[i]);
}
else
{
printf ("%d <--%d	",i,v1);
printf ("9999\n");			//不存在路径时,路径长度设为9999
}
}
}

int main(void)
{
int vnum;
int cost[MAX][MAX];
vnum = creat_cost(cost);		//建立图的邻接矩阵
dijkstra(cost,vnum);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: