求大神帮助!!!关于寻路问题
给定任意n个点,并给定它们之间的距离,求出从结点v到结点u的最短距离,其中结点v和u是n个结点中的任意两点。
要求:1、自己输入总共的点数
2、自己输入2点之间的距离
3、输出最短距离
[解决办法]
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define MVNum 100#define Maxint 32767enum boolean{FALSE,TRUE};typedef char VertexType;typedef int Adjmatrix;typedef struct{ VertexType vexs[MVNum]; Adjmatrix arcs[MVNum][MVNum];}MGraph;int D1[MVNum],P1[MVNum];int D[MVNum][MVNum],P[MVNum][MVNum];void CreateMGraph(MGraph * G,int n,int e){ int i,j,k,w; for(i=1;i<=n;i++) G->vexs[i]=(char)i; for(i=1;i<=n;i++) for(j=1;j<=n;j++) G->arcs[i][j]=Maxint; printf("输入%d条边的i,j及w:\n",e); for(k=1;k<=e;k++) { scanf("%d,%d,%d",&i,&j,&w); G->arcs[i][j]=w; } printf("有向图的存储结构建立完毕!\n");}void Dijkstra(MGraph *G,int v1,int n){ int D2[MVNum],P2[MVNum]; int v,i,w,min; enum boolean S[MVNum]; for(v=1;v<=n;v++) { S[v]=FALSE; D2[v]=G->arcs[v1][v]; if(D2[v]<Maxint) P2[v]=v1; else P2[v]=0; } D2[v1]=0;S[v1]=TRUE; for(i=2;i<n;i++) { min=Maxint; for(w=1;w<=n;w++) if(!S[w] && D2[w]<min) { v=w;min=D2[w]; } S[v]=TRUE; for(w=1;w<=n;w++) if(!S[w] && (D2[v]+G->arcs[v][w]<D2[w])) { D2[w]=D2[v]+G->arcs[v][w]; P2[w]=v; } } printf("路径长度 路径\n"); for(i=1;i<=n;i++){ printf("%5d",D2[i]); printf("%5d",i); v=P2[i]; while(v!=0) { printf("<-%d",v); v=P2[v]; } printf("\n"); }}void Floyd(MGraph *G,int n){ int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(G->arcs[i][j]!=Maxint) P[i][j]=j; else P[i][j]=0; D[i][j]=G->arcs[i][j]; } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(D[i][k]+D[k][j]<D[i][j]) { D[i][j]=D[i][k]+D[k][j]; P[i][j]=P[i][k]; } } }}void main(){ MGraph *G; int n,e,v,w,k; int xz=1; G=(MGraph *)malloc(sizeof(MGraph)); printf("输入图中顶点个数和边数n,e: "); scanf("%d,%d",&n,&e); CreateMGraph(G,n,e); while(xz!=0) { printf("******求城市之间的最短路径******\n"); printf("================================\n"); printf("1.求一个城市到所有城市的最短路径\n"); printf("2.求任意的两个城市之间的最短路径\n"); printf("================================\n"); printf("请选择:1 或 2,选择 0 退出:"); scanf("%d",&xz); if(xz==2) { Floyd(G,n); printf("输入源点(或称起点)和终点:v,w: "); scanf("%d,%d",&v,&w); k=P[v][w]; if(k==0) printf("顶点 %d 到 %d 无路径!\n",v,w); else { printf("从顶点 %d 到 %d 的最短路径是 %d\n",v,w,v); while(k!=w) { printf("->%d",k); k=P[k][w]; } printf("->%d",w); printf("路径长度: %d\n",D[v][w]); } } else if(xz==1) { printf("求单源路径,输入源点 v: "); scanf("%d",&v); Dijkstra(G,v,n); } } printf("结束求最短路径,再见!\n");}