0
点赞
收藏
分享

微信扫一扫

YTU.3029: 迪克斯特拉算法


3029: 迪克斯特拉算法


Time Limit: 1 Sec   Memory Limit: 128 MB

Submit: 70  

Solved: 43

[

​​Submit​​][

​​Status​​][

​​Web Board​​]


Description


对于如图所示的一个带权有向图,采用迪克斯特拉算法求出从顶点0到其他各顶点的最短路径及其长度。



Input



Output


To 1 1 1

To 2 4 2

……

……


刚看到这道题,对于第二行的输出样例表示很迷惑,老想着它的路径,看了好久才发现TO 2 4 2意思是从0到2最短路径为4,长度为2(也就是经过1到2).,那么在前一篇的代码上做一定修改即可,定义一个Q[ ]数组表示它的长度,初值为1,比如0到2,就是1+1=2(0到1为1,1到2为1)

AC代码:


#include <stdio.h>
#include <stdlib.h>
#define MAXV 100
#define INF 999999
int Q[MAXV]={1,1,1,1,1};
typedef struct{
int edges[MAXV][MAXV];//邻接矩阵的边数组
int n,e;//顶点数,边数
}MGraph;//完整的图邻接矩阵类型
void Dispath(MGraph g,int dist[],int path[],int s[],int v);
void Dijkstra(MGraph g,int v)
{
int dist[MAXV];//dist[i]保存从源点到i的目前的最短路径长度
int path[MAXV];//path[i]保存当前最短路径中的前一个顶点的编号
int s[MAXV];//标记已找到最短路径的顶点,s[i]=0表示未找到,s[i]=1表示已找到。
int mindis,i,j,u;
for(i=0;i<g.n;i++)
{
dist[i]=g.edges[v][i];//距离初始化
s[i]=0;//s[ ]置空
if(g.edges[v][i]<INF)//路径初始化
path[i]=v;//顶点v到顶点i有边时,置顶点i的前一个顶点为v
else
path[i]=-1;//顶点v到顶点i没有边时,置顶点i的前一个顶点为-1
}
s[v]=1;//源点编号v放入s中
path[v]=0;
for(i=0;i<g.n;i++)//循环直到所有顶点的最短路径都求出
{
mindis=INF;//mindis置最小长度初值为无穷大
u=-1;
for(j=0;j<g.n;j++)
if(s[j]==0&&dist[j]<mindis)//选取不在s[]中且具有最小距离的顶点u
{
u=j;
mindis=dist[j];
}
s[u]=1;//顶点u加入s
for(j=0;j<g.n;j++)//修改不在s中的顶点的距离
if(s[j]==0)
if(g.edges[u][j]<INF&&dist[u]+g.edges[u][j]<dist[j])
{
Q[j]=Q[u]+1;
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
Dispath(g,dist,path,s,v);
}
void Dispath(MGraph g,int dist[],int path[],int s[],int v)
{
int i,j,k;
for(i=0;i<g.n;i++)
if(s[i]==1&&i!=v)
{
printf("To %d %d %d\n",i,dist[i],Q[i]);
}
}

int main()
{
int i,j,u=0;
MGraph g;
int A[MAXV][6]={
{0,1,5,2,INF,INF},
{INF,0,3,INF,7,INF},
{INF,INF,0,INF,INF,6},
{INF,INF,INF,0,INF,8},
{INF,INF,INF,INF,0,4},
{INF,INF,INF,INF,INF,0}};
g.n=6;g.e=10;
for(i=0;i<g.n;i++)
for (j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
Dijkstra(g,u);
printf("\n");
}


YTU.3029: 迪克斯特拉算法_#define





举报

相关推荐

0 条评论