Dijkstra

1、對於每條邊僅鬆弛一次

2、複雜度低於Bellmall-Ford

3、邊的權重爲非負值

4、時間複雜度O(V*lgV)



INITIALIZE-SINGLE-SOURCE(G,s)

for ecah vertex v屬於G.V

     v.d=MAXINT

     v.prev=NULL

s.d=0


僞碼:

DIJKSTRA(G,w,s)

INITIALIZE-SINGLE-SOURCE(G,s)

S=NULL

Q=G.V

while Q!=NULL

     u=EXTRACT-MIN(Q)

     S=S U {u}

     for each vertex v屬於G.Adj[u]

          RELAX(u,v,w)


c++實現:

namespace A{
       int prev[100];//各個節點的前驅節點
       int dist[100];//各個節點到源節點的最短距離
       int c[100][100];//用臨接矩陣表示圖
       bool s[100];//表示節點是否已經加入S集合
       int nodenum;//節點個數
       int line;//邊的條數
       int startnode;//源節點
       int src, dst, weight;
       const int MAXINT = 9999;

       void init()
       {
              cout << "輸入節點個數:"; cin >> nodenum;
              cout << "輸入邊的條數:"; cin >> line;
              cout << "輸入源節點編號:"; cin >> startnode;
              for (int i = 1; i <= nodenum; ++i){
                     for (int j = 1; j <= nodenum; ++j)
                           c[i][j] = MAXINT;
              }
              cout << "輸入" << line << "行src dst wight:";
              for (int i = 1; i <= line; ++i){
                     cin >> src >> dst >> weight;
                     c[src][dst] = weight;
                     //c[dst][src]=weight;//無向圖
              }
              for (int i = 1; i <= nodenum; ++i){
                     dist[i] = c[startnode][i];
                     if (dist[i] == MAXINT)
                           prev[i] = -1;
                     else
                           prev[i] = startnode;
              }
              dist[startnode] = 0;
              for (int i = 1; i <= nodenum; ++i){
                     s[i] = false;
              }
              s[startnode] = true;
       }
       void Dijkstra()
       {
              init();
              int scount = 1;
              while (scount < nodenum){
                     int tmp = MAXINT;
                     int u;
                     for (int i = 1; i <= nodenum; ++i){
                           if (s[i] == false && dist[i] < tmp) {
                                  tmp = dist[i];
                                  u = i;
                           }
                     }
                     s[u] = true;
                     for (int i = 1; i <= nodenum; ++i){
                           if (s[i] == false && c[u][i] < MAXINT&&c[u][i] + tmp < dist[i]){
                                  dist[i] = c[u][i] + tmp;
                                  prev[i] = u;
                           }
                     }
                     ++scount;
              }
       }
};
int main()
{
       A::Dijkstra();
       for (int i = 1; i <= A::nodenum; ++i)
              cout << A::dist[i] << " ";
       cout << endl;
       system("pause");
       return 0;
}

測試用例:

5

7

1

1 2 10

1 4 30

1 5 100

2 3 50

3 5 10

4 3 20

4 5 60



《完》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章