最短路径(Floyed算法)

来源:互联网 发布:肖像漫画软件 编辑:程序博客网 时间:2024/05/18 02:28
 #include <iostream>#include <cstdio>#define  MAX 63355#define  N   20typedef char Elemtype;typedef int Status;typedef struct Graph{Elemtype vexs[N];  //顶点 Status     arcs[N][N];       //边的权值  int V,E;  //顶点与边int path[N];}Graph; void Create_Graph(Graph &G){  printf("输入顶点与边数目:\n") ;  scanf("%d%d",&G.V,&G.E);  int v = G.V,e = G.E;    for(int i = 0;i<v;i++){       /*初始化*/      for(int j = 0;j<v;j++)          G.arcs[i][j] = MAX;        }  printf("输入边值:\n") ;                                 for(int i = 0;i<v;i++){/*输入边值*/        scanf("%c",&G.vexs[i]);        getchar();}printf("输入边的下标以及权值:\n") ; int w,index1,index2;        for(int i = 0;i<e;i++){ /*输入权值以及边对应下标*/         scanf("%d%d%d",&index1,&index2,&w);        G.arcs[index1][index2] = w;}}/*int Locate(Graph G,Elemtype x){for(int i = 0;i<G.V;i++){    if(G.vexs[i]==x)    return i;}return -1;}*/ void Floyed(Graph &G){  /*Floyed算法*/for(int k = 0;k<G.V;k++){                      //用于探索的点置于最外层 for(int i = 0;i<G.V;i++){for(int j = 0;j<G.V;j++){    if(G.arcs[i][j]>G.arcs[i][k]+G.arcs[k][j])      G.arcs[i][j] = G.arcs[i][k]+G.arcs[k][j];        }    }}for(int i = 0;i<G.V;i++){/*矩阵形式输出各顶点的最短路径*/for(int j = 0;j<G.V;j++){if(G.arcs[i][j]!=MAX)      printf("%4d",G.arcs[i][j]);}     printf("\n");     }  }void Path(Graph &G){while(true){//getchar();int i,j;//char a,b;printf("输入查询的顶点的下标:\n") ;scanf("%d%d",&i,&j);//printf("输入要查询的两元素:\n");//getchar();//scanf("%c%c",&a,&b);//i = Locate(G,a),j = Locate(G,b);int t = 0; for(int k = 0;k<G.V;k++){   /*输出两顶点的最短路径长*/                if(G.arcs[i][j]<MAX&&G.arcs[i][k]+G.arcs[k][j]<G.arcs[i][j]){  G.arcs[i][j] = G.arcs[i][k]+G.arcs[k][j];  }}int item = G.arcs[i][j];printf("%d->%d最短路径长为:%d\n",i,j,item);     }}int main(int argc, char** argv) {Graph G;Create_Graph(G);Floyed(G);Path(G);return 0;}