迪杰斯特拉算法(可打印最短路径)

来源:互联网 发布:mac 中文字幕乱码 编辑:程序博客网 时间:2024/06/03 21:34
  1. #include <iostream>  
  2. #include <iomanip>  
  3. #include <string>  
  4. using namespace std;  
  5.   
  6. #define INFINITY 65535//无边时的权值  
  7. #define MAX_VERTEX_NUM 10//最大顶点数  
  8.   
  9. typedef struct MGraph{  
  10.     string vexs[10];//顶点信息  
  11.     int arcs[10][10];//邻接矩阵  
  12.     int vexnum, arcnum;//顶点数和边数  
  13. }MGraph;  
  14.   
  15. int LocateVex(MGraph G, string u)//返回顶点u在图中的位置  
  16. {  
  17.     for(int i=0; i<G.vexnum; i++)  
  18.         if(G.vexs[i]==u)  
  19.             return i;  
  20.     return -1;  
  21. }  
  22.   
  23. void CreateDN(MGraph &G)//构造有向网  
  24. {  
  25.     string v1, v2;  
  26.     int w;  
  27.     int i, j, k;  
  28.     cout<<"请输入顶点数和边数:";  
  29.     cin>>G.vexnum>>G.arcnum;  
  30.   
  31.     cout<<"请输入顶点:";  
  32.     for(i=0; i<G.vexnum; i++)  
  33.         cin>>G.vexs[i];  
  34.   
  35.     for(i=0; i<G.vexnum; i++)  
  36.         for(j=0; j<G.vexnum; j++)  
  37.             G.arcs[i][j]=INFINITY;  
  38.   
  39.     cout<<"请输入边和权值:"<<endl;  
  40.     for(k=0; k<G.arcnum; k++)  
  41.     {  
  42.         cin>>v1>>v2>>w;  
  43.         i=LocateVex(G, v1);  
  44.         j=LocateVex(G, v2);  
  45.         G.arcs[i][j]=w;  
  46.     }  
  47. }  
  48.   
  49. //迪杰斯特拉算法求有向网G的v0顶点到其余顶点v的最短路径p[v]及带权长度D[v]  
  50. //p[][]=-1表示没有路径,p[v][i]存的是从v0到v当前求得的最短路径经过的第i+1个顶点(这是打印最短路径的关键),则v0到v的最短路径即为p[v][0]到p[v][j]直到p[v][j]=-1,路径打印完毕。  
  51. //final[v]为true当且仅当v∈S,即已经求得从v0到v的最短路径。  
  52. void ShortestPath_DIJ(MGraph G, int v0, int p[][MAX_VERTEX_NUM], int D[])  
  53. {  
  54.     int v, w, i, j, min;  
  55.     bool final[10];  
  56.       
  57.     for(v=0; v<G.vexnum; v++)  
  58.     {  
  59.         final[v]=false;//设初值  
  60.         D[v]=G.arcs[v0][v];//D[]存放v0到v得最短距离,初值为v0到v的直接距离  
  61.         for(w=0; w<G.vexnum; w++)  
  62.             p[v][w]=-1;//设p[][]初值为-1,即没有路径  
  63.         if(D[v]<INFINITY)//v0到v有直接路径  
  64.         {  
  65.             p[v][0]=v0;//v0到v最短路径经过的第一个顶点  
  66.             p[v][1]=v;//v0到v最短路径经过的第二个顶点  
  67.         }  
  68.     }  
  69.       
  70.     D[v0]=0;//v0到v0距离为0  
  71.     final[v0]=true;//v0顶点并入S集  
  72.       
  73.     for(i=1; i<G.vexnum; i++)//其余G.vexnum-1个顶点  
  74.     {//开始主循环,每次求得v0到某个顶点v的最短路径,并将v并入S集,然后更新p和D  
  75.         min=INFINITY;  
  76.         for(w=0; w<G.vexnum; w++)//对所有顶点检查  
  77.             if(!final[w] && D[w]<min)//在S集之外(即final[]=false)的顶点中找离v0最近的顶点,将其赋给v,距离赋给min  
  78.             {  
  79.                 v=w;  
  80.                 min=D[w];  
  81.             }  
  82.             final[v]=true;//v并入S集  
  83.             for(w=0; w<G.vexnum; w++)//根据新并入的顶点,更新不在S集的顶点到v0的距离和路径数组  
  84.             {  
  85.                 if(!final[w] && min<INFINITY && G.arcs[v][w]<INFINITY && (min+G.arcs[v][w]<D[w]))  
  86.                 {//w不属于S集且v0->v->w的距离<目前v0->w的距离  
  87.                     D[w]=min+G.arcs[v][w];//更新D[w]  
  88.                     for(j=0; j<G.vexnum; j++)//修改p[w],v0到w经过的顶点包括v0到v经过的所有顶点再加上顶点w  
  89.                     {  
  90.                         p[w][j]=p[v][j];  
  91.                         if(p[w][j]==-1)//在p[w][]第一个等于-1的地方加上顶点w  
  92.                         {  
  93.                             p[w][j]=w;  
  94.                             break;  
  95.                         }  
  96.                     }                     
  97.                       
  98.                 }  
  99.             }  
  100.     }     
  101. }  
  102.   
  103. void main()  
  104. {  
  105.     int i, j;  
  106.     MGraph g;  
  107.     CreateDN(g);  
  108.     int p[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//最短路径数组p  
  109.     int D[MAX_VERTEX_NUM];//最短距离数组D  
  110.     ShortestPath_DIJ(g, 0, p, D);  
  111.       
  112.     cout<<"最短路径数组p[i][j]如下:"<<endl;  
  113.     for(i=0; i<g.vexnum; i++)  
  114.     {  
  115.         for(j=0; j<g.vexnum; j++)  
  116.             cout<<setw(3)<<p[i][j]<<" ";  
  117.         cout<<endl;  
  118.     }  
  119.   
  120.     cout<<g.vexs[0]<<"到各顶点的最短路径及长度为:"<<endl;  
  121.     for(i=0; i<g.vexnum; i++)  
  122.     {  
  123.         if(i!=0 && D[i]!=INFINITY)  
  124.         {  
  125.             cout<<g.vexs[0]<<"-"<<g.vexs[i]<<"的最短路径长度为:"<<D[i];  
  126.             cout<<"  最短路径为:";  
  127.             for(j=0; j<g.vexnum; j++)  
  128.             {  
  129.                 if(p[i][j]>-1)  
  130.                     cout<<g.vexs[p[i][j]]<<" ";  
  131.             }  
  132.             cout<<endl;             
  133.         }  
  134.         else if(D[i]==INFINITY)  
  135.             cout<<g.vexs[0]<<"-"<<g.vexs[i]<<":"<<"不可达"<<endl;  
  136.     }  
  137.   
  138. }  


0 0
原创粉丝点击