内存:128  时间:1

题目描述

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

输入

输出

To 1 1 1

To 2 4 2

……

……

样例输入

样例输出

提示

代码如下

#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
",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("
");
}

代码来源于互联网,仅供参考!