1. 程式人生 > >單源最短路(dijkstra)模板

單源最短路(dijkstra)模板

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
const int inf = 9999999;
int minn,flag;
int main(void)
{
    int a[105][105];
    int dij[105];
    int vis[105];
    int n , m;
    scanf("%d %d",&n, &m);
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= n ; j ++)
        {
            if(i == j)
                a[i][j] = 0;
            else
                a[i][j] = inf;
        }
    }//初始化圖
    int from , to ,val;
    for(int i = 1 ; i <= m ; i ++)
    {
        scanf("%d %d %d",&from,&to,&val);
        a[from][to] = val;
    }//輸入邊權
    for(int i = 1 ; i <= n ; i++)
        dij[i] = a[1][i];//一號點到所有點的距離
    memset(vis,0,sizeof(vis));
    vis[1] = 1;
    //dij演算法核心
    for(int i = 1 ; i <= n - 1 ; i ++)
    {
        minn = inf;
        for(int j = 1 ; j <= n ; j ++)//尋找距離一號點最近的那個點
        {
            if(vis[j] == 0 && dij[j] < minn)
            {
                minn = dij[j];
                flag = j;
            }
        }
        vis[flag] = 1;
        for(int k = 1 ; k <= n ; k ++)//尋找對應點出邊,並進行"鬆弛"處理
        {
            if(a[flag][k] < inf)
            {
                if(dij[k] > dij[flag] + a[flag][k])
                    dij[k] = dij[flag] + a[flag][k];
            }
        }
    }
    for(int i = 1 ; i <= n ; i ++)
        printf("%d ",dij[i]);
    return 0;
}

測試資料:

6 9

1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

輸出資料:

0  1  8  4  13  17