dijkstra算法

用途

用來確定一個點到其他幾個點的最近距離(不含負權的有向圖)

算法思想

1.以各點到初始點的距離爲最近距離(即直接與初始點相連的邊的權),如果不直接相連的距離則爲無窮。
2.選取這些邊最短的,並判斷該邊的head與其他的點是否相連,如果相連之後的距離小於目前的最小距離,就更新初始點到各點的最小距離。(此時選出的最短的這條邊的權就是他的head到初始點的最近距離,這時已經不需要判定該head距離初始點的最近距離,爲其做上標記)
3.不斷重複2操作知道所有的點都被標記,這是就選出了最近距離。

代碼實現

  int a,b;      //a代表的是節點數,b代表的是弧的數量
  int start;   //start代表的是初始位置
  int path[a][a];    //鄰接矩陣
  int path2[a], p2[a];   //path2待選擇的路徑,已選擇好的最短路徑
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<a;j++)
        {
            path[i][j]=10000;   //對對鄰接矩陣進行初始化
        }
    }
    for(int i=0;i<a;i++)
    {
        p2[i]=10000;            //對最短路徑進行初始化
    }

    string p[a];
    int a2,b2,length;
    for(int i=0;i<b;i++)
    {
        cin>>a2>>b2>>length;
        path[a2][b2]=length;
    }    //輸入鄰接矩陣的內容
    for(int i=0;i<a;i++)
    {
        path2[i]=path[start][i];   
    }
    for(int i=0;i<a-1;i++)     
    {
        int h=pd(path2,a);    //pd是自定義的一個找最小權邊的函數
        if(h!=-1)           // h=-1說名path2中的未標記節點到初始點最近距離的值還是10000,即包括初始點在內的已標記節點與他們都無邊相連,初始點無法到達他們,則循環無需進行下去
        {p2[h]=path2[h];
        path2[h]=0;
        for(int j=0;j<a;j++)
        {
            if((p2[h]+path[h][j])<path2[j])
            {
                path2[j]=p2[h]+path[h][j];
                p[j]=p[h];
                p[j].push_back(48+h);
            }
        }
        }
        else{
            break;
        }
    }
發佈了15 篇原創文章 · 獲贊 0 · 訪問量 618
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章