2015年大二上-数据结构-图-2-(3)-Dijkstra算法

来源:互联网 发布:mac搜狗输入法不能用 编辑:程序博客网 时间:2024/05/20 20:18
/**Copyright (c) 2014,烟台大学计算机学院*All rights reserved.*文件名称:Annpion.cpp*作者:王耀鹏*完成日期:2016年3月2日*版本号:v1.0**问题描述:Dijkstra算法*输入描述:图*输出描述:Dijkstra算法*/#include<stdio.h>#include<malloc.h>#include "Graph.h"#define MaxSize 100void Ppath(int path[],int i,int v)  //前向递归查找路径上的顶点{    int k;    k=path[i];    if(k==v)        return ;    Ppath(path,k,v);    printf("%d,",k);}void Dispath(int dist[],int path[],int s[],int n,int v){    for(int i=0;i<n;++i)    {        if(s[i]==1)        {            printf("  从%d到%d的最短路径长度为:%d\t路径为:",v,i,dist[i]);            printf("%d,",v);            Ppath(path,i,v);            printf("%d\n",i);        }        else            printf("从%d到%d不存在路径\n",v,i);    }}void Dijkstra(MGraph g,int v){    int dist[MAXV],path[MAXV],s[MAXV],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;        else            path[i]=-1;    }    s[v]=1;    path[v]=0;    for(i=0;i<g.n;++i)         //循环直到所有顶点的最短路径都求出    {        mindis=INF;        for(j=0;j<g.n;++j)            if(s[j]==0 && dist[j]<mindis)        {            u=j;            mindis=dist[j];        }        s[u]=1;        for(j=0;j<g.n;++j)        {            if(s[j]==0)            {                if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])                {                    dist[j]=dist[u]+g.edges[u][j];                    path[j]=u;                }            }        }    }    Dispath(dist,path,s,g.n,v);     //输出最短路径}int main(){    MGraph g;    int A[7][7]=    {        {0,4,6,6,INF,INF,INF},        {INF,0,1,INF,7,INF,INF},        {INF,INF,0,INF,6,4,INF},        {INF,INF,2,0,INF,5,INF},        {INF,INF,INF,INF,0,INF,6},        {INF,INF,INF,INF,1,0,8},        {INF,INF,INF,INF,INF,INF,0}    };    ArrayToMat(A[0], 7, g);    Dijkstra(g,0);    return 0;}


附:测试用图结构
这里写图片描述

运行结果:


0 0
原创粉丝点击