求顶点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"); } }