Dijkstra算法

求顶点v0=0到其他各个点的最小距离

#include<iostream>
using namespace std;

#define    N 100//最大顶点个数
#define INF 32767 
typedef struct/*图的邻接矩阵类型*/
{      
    int edges[N][N]; //邻接矩阵
       int vexnum,arcnum; //顶点数,弧数
    //int vexs[N];//存放顶点信息---如该顶点的下一个顶点
} MGraph;
void DispMG(MGraph g);//输出邻接矩阵
void Dijkstra(MGraph g,int v0);//狄克斯特拉算法从顶点v0到其余各顶点的最短路径
void DisPath(int dist[],int path[],int s[],int n,int v0);//由path计算最短路径
void PPath(int path[],int i,int v0);

int main()
{
    int A[N][6]={    {INF,INF,10 ,INF,30 ,100},
                    {INF,INF,5  ,INF,INF,INF},
                    {INF,INF,INF,50 ,INF,INF},
                    {INF,INF,INF,INF,INF,10 },
                    {INF,INF,INF,20 ,INF,60 },
                    {INF,INF,INF,INF,INF,INF}
                };
    MGraph g;//实例化邻接矩阵
    g.vexnum=6;
    g.arcnum=10;//6个顶点,10条边
    for (int i=0;i<g.vexnum;i++)
        for (int j=0;j<g.vexnum;j++)
            g.edges[i][j]=A[i][j];

    printf("有向图G的邻接矩阵:\n");
    DispMG(g);//输出邻接矩阵
    int v0=0;//起始点
    Dijkstra(g,v0);
    return 0; 
}


void Dijkstra(MGraph g,int v0)//狄克斯特拉算法从顶点v0到其余各顶点的最短路径
{
    int i,j;
    int Dist[N],Path[N];//Dist[j]---v0到j的最短距离、Path[j]---记录j的前一个顶点
    int S[N];//S表---标记已考察过的顶点    
    for (i=0;i<g.vexnum;i++) 
    {    
        Dist[i]=g.edges[v0][i];//距离初始化
        if (g.edges[v0][i]<INF)//路径初始化
             Path[i]=v0;//若v0到i有路径,则i的前一个顶点是v0
        else Path[i]=-1;//         没有路径,则标记为-1
        S[i]=0;//S[]=0,表示顶点i不在S表中
    }

    S[v0]=1;//源点编号v0放入S表中---标记为1
    Path[v0]=0;//v0=0,他没有前缀顶点,所以他的前一个顶点设置为自己本身0
    for (i=0;i<g.vexnum;i++)                 
    {            
        int MinDis=INF;//距v0的--最小距离
        int u=-1;//距v0的--最小距离顶点编号
        for (j=0;j<g.vexnum;j++)//选取不在S表中且具有最小距离的顶点u
            if (S[j]==0 && Dist[j]<MinDis) 
            {         
                MinDis=Dist[j];    
                u=j;
            }
        //printf("%d\n",MinDis);
        if(MinDis!=INF)   S[u]=1;//顶点u加入S表中---标记为1
        else break;

        for (j=0;j<g.vexnum;j++)//修改不在S表中的顶点的距离
            if (S[j]==0) 
                if (g.edges[u][j]<INF && Dist[u]+g.edges[u][j]<Dist[j])//u,j连通,且Dist[j]可更小                    
                {    
                    Dist[j]=Dist[u]+g.edges[u][j];
                    Path[j]=u;//v0到j的最短路径中,j的前一个顶点是u
                }  
    }
    printf("输出最短路径:\n");
    DisPath(Dist,Path,S,g.vexnum,v0);/*输出最短路径*/
}
void DisPath(int Dist[],int Path[],int S[],int n,int v0) /*由path计算最短路径*/
{
    int i;
    for (i=0;i<n;i++)
        if (S[i]==1 && i!=v0) //S表中的顶点才有路径输出
        {    
              printf("从%d到%d的最短路径长度为:%d",v0,i,Dist[i]);
            printf("\t路径为:%d,",v0);
            PPath(Path,i,v0);
            printf("%d\n",i);
        }
        else  
            printf("从%d到%d不存在路径\n",v0,i);
}
void PPath(int Path[],int i,int v0) 
{
    int k=Path[i];
    if (k==v0)  return;
    else PPath(Path,k,v0);
    printf("%d,",k);
}
void DispMG(MGraph g)/*输出邻接矩阵*/
{
    int i,j;
    for (i=0;i<g.vexnum;i++)
    {
        for (j=0;j<g.vexnum;j++)
            if (g.edges[i][j]==INF)
                  printf("%4s","");
            else  printf("%4d",g.edges[i][j]);
        printf("\n");
    }
}

posted on 2012-10-20 18:10  IThinktan  阅读(379)  评论(0编辑  收藏  举报

导航