Dijstra算法
Dijstra算法
// Dijkstra.cpp : 定义控制台应用程序的入口点。 // /*************************************** * About: 有向图的Dijkstra算法实现 * Author: fanfan * Blog: https://www.cnblogs.com/AmatVictorialCuram/ ***************************************/ #include"stdafx.h" #include<iostream> #include<stdio.h> #define MaxSize 20 #define INFINITY 65535 //定义一个别名 typedef char VerTexType; typedef struct Grap{ VerTexType ver[MaxSize+1]; int edg[MaxSize][MaxSize]; }Graph; //邻接矩阵图表示法的生成函数 void CreateGraph(Graph *g) { int i=0; int j=0; int VerTexNum; VerTexType Ver; printf("请输入图的顶点:\n"); while('\n'!=(Ver=getchar())) { g->ver[i++]=Ver; } g->ver[i]='\0'; VerTexNum=strlen(g->ver); printf("请输入相应的邻接矩阵:\n "); for(i=0;i<VerTexNum;i++) { for(j=0;j<VerTexNum;j++) { scanf("%d",&g->edg[i][j]); } } } //求图的顶点数 int CalVerNum(Graph g) { return strlen(g.ver); } //将不邻接的顶点之间的权值设置为INFINITY void SetWeight(Graph *g) { int i,j; for(i=0;i<CalVerNum(*g);i++) { for(j=0;j<CalVerNum(*g);j++) { if(0==g->edg[i][j]) { g->edg[i][j]=INFINITY; } } } } //Dijkstra求最短路径函数 void Dijkstra(Graph g) { int VerTexNum=CalVerNum(g);//图的顶点的个数 int i,j,k,m,n;// int mini;//最短路径 int *used=(int *)malloc(sizeof(int)*VerTexNum);//数组,将已经寻找到的最短路径用这个变量来标记 int *distance=(int *)malloc(sizeof(int)*VerTexNum);//最短的距离,最终结果 int *parent=(int *)malloc(sizeof(int)*VerTexNum);//最短路径的前驱节点 SetWeight(&g);//设置权值不邻接的两个顶点的权值设置为无穷大 for(i=0;i<VerTexNum;i++) { used[i]=0;//所有的顶点,没有使用过的顶点都设置为0 parent[i]=0; distance[i]=g.edg[0][i];//初始化为与编号为0的顶点的距离,最短路径的大小初始化为0,编号为0的顶点与其他顶点的距离为0 } used[0]=1; printf("初始化状态,源点到其他个点的最短路径为:"); for(k=0;k<VerTexNum;k++) { printf("%d \t",distance[k]); } printf("\n"); //这里是核心 for(i=0;i<VerTexNum-1;i++) { j=0; mini=INFINITY;//最短路径先设置为无穷大 for(m=0;m<VerTexNum;m++) { //还没有寻找过的,等于0的状态下,并且距离小于最短路径的 if((0==used[m])&&(distance[m]<mini)) { //将最短路径定义为源点到他的路径 mini=distance[m]; //j为刚刚找到的v-u中到源点路径最短的顶点 j=m; } } used[j]=1; for(n=0;n<VerTexNum;n++) { if((0==used[n])&&(distance[n]>distance[j]+g.edg[j][n])) { //由于有顶点新加入U集合,对距离数组distance进行更新, //比较原路径长度与以新加入的顶点为中间点的路径长度 distance[n]=distance[j]+g.edg[j][n]; parent[n]=j; } } printf("第%d次循环后,源点到其他个点的最短路径为:\n",i+1); for(k=0;k<VerTexNum;k++) { printf("%d \t",distance[k]); } printf("\n"); } for(i=0;i<VerTexNum;i++) { printf("节点%c的前驱节点是%c \n",g.ver[parent[i]]); } printf("\n"); printf("最短路径长度为:%d\n",mini); } int main() { Graph g; freopen("short_path.txt","r",stdin); CreateGraph(&g); Dijkstra(g); return 0; }