Dijkstra

(1)一般是单起点问题,操作步骤就是选择起点vis标记 然后更新距离数组d
然后循环从d数组中选取最小值,作为新起点vis,更新数组d。重复n-1次。
(2)多起点多终点问题 初始化将所有起点vis标记 然后更新距离数组d,类似最小生成树,把多起点化为一个起点。
(3)如果是多起点唯一终点,可以转化成一般的单起点问题,逆向思考。
也可以就按照(2)来做。
以下是单起点的大概样子,具体情况具体改。

void Dijkstra(){
    int k;
    int vis[maxn];
    memset(vis, 0, sizeof(vis));
    vis[1] = 1;
    for(i = 1; i < t; i++)
        d[i] = G[1][i];
    for(i =1; i < t-1; i++)
    {
        int minn =inf;
        for(j = 1; j < t; j++)
        {
            if(!vis[j] && d[j] < minn)
            {
                minn = d[j];
                k = j;
            }
        }
        if(minn == inf)
            break;
        vis[k] = 1;
        for(j = 1; j < t; j++){
            if(!vis[j] && d[j] > d[k] + G[k][j])
                d[j] = d[k] + G[k][j];
        }
    }

}

你可能感兴趣的:(图论)