1. 程式人生 > >單源最短路——Dijkstara算法

單源最短路——Dijkstara算法

並且 n) scanf 輸出 -s pre getchar 初始 得到

  算法基本思想:每次找到離源點最近的一個頂點,然後以該頂點為中心進行擴展,最終得到源點到其余所有點的最短路徑。

  1、將所有的頂點分為兩個部分:已知最短路程的頂點集合P和未知最短路徑的頂點集合Q

  2、設置源點s到自己的最短路徑為0,若存在有源點能夠直接到達的頂點i則吧dis[i]設置為e[s][i]。同時把所有其它不能直接到達的頂點的最短路徑設置為∞

  3、在集合Q的所有頂點中選擇一個離源點s最近的頂點u即dis[u]最小,加入到集合P。並考察所有以點u為起點地邊,對每條邊進行松弛操作。

  4、重復第三步,直到集合Q為空,算法結束。最終dis數組中的值就是源點到所有頂點的最短路徑。

//dijketra算法
int main()
{
    int e[10][10];
    int book[10];
    int dis[10];
    int i, j, n, m, t1, t2, t3, u, v, min;
    int inf = 99999999;//用inf存儲一個我們認為的正無窮值

    //讀入n和m;n表示定點個數,m表示邊的條數
    scanf("%d%d",&n,&m);

    //初始化e矩陣
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            
if (i == j) e[i][j] = 0; else e[i][j] == inf; // 讀入邊 for (i = 1; i <= m; i++) { scanf("%d%d%d",&t1,&t2,&t3); e[t1][t2] = t3; } //初始化dis數組,這裏是1號頂點到其余各個頂點的初始路程。 for (i = 1; i <= n; i++) dis[i]
= e[1][i]; //book數組初始化,book數組用來記錄當前點是否被訪問,訪問1 else0 for (i = 1; i <= n; i++) book[i] = 0; book[1] = 1;//一號頂點標記 //核心算法 for (i = 1; i <= n - 1; i++) { //找到離一號頂點最近的頂點 min = inf;//將最小值復制為無窮 for (j = 1; j <= n; j++) { //如果當前頂點沒有被訪問,並且當前dis數組中的值小於最小值 if (book[j] == 0 && dis[j] < min) { min = dis[j];//更新最小值 u = j;// 標記當前點 } } book[u] = 1;//標記當前點被訪問 for (v = 1; v <= n; v++) { if (e[u][v] < inf) { //遍歷u打頭的e數組 if (dis[v] > dis[u] + e[u][v]) dis[v] = dis[u] + e[u][v];//獲得最短路徑 } } } //輸出結果 for (i = 1; i <= n; i++) { printf("%d\t",dis[i]); } getchar(); getchar(); return 0; }

單源最短路——Dijkstara算法