CS基础

最短路径算法

2016-12-03  本文已影响845人  郑明明
最短路径算法在现实生活中也具有非常多的应用,例如在一个复杂的景区,想要从一个景点到另外一个景点,利用最短路径算法就可以找到最短的路程,而如果不做规划就随缘前往,可能会绕很多路才能到达,虽然到了,但是精力都花费在走路上了,更别说去观光景点了。
#define MAX    100
#define INF    32767
int tempMatrix[MAX][MAX]; // 邻接矩阵
int mVexNum; // 顶点数量
void dijkstra(int start, int prev[], int dist[])
{
    int i,j,k = 0;
    int min;
    int tmp;
    int flag[MAX];      // flag[i] = 1 表示"顶点vs"到"顶点i"的最短路径已成功获取。
    
    // 初始化
    for (i = 0; i < mVexNum; i++)
    {
        flag[i] = 0;              // 顶点i的最短路径还没获取到。
        prev[i] = 0;              // 顶点i的前驱顶点为0。
        dist[i] = tempMatrix[start][i]; // 顶点i的最短路径为"顶点start"到"顶点i"的权。
    }
    
    // 对"顶点start"自身进行初始化
    flag[start] = 1;
    dist[start] = 0;
    
    // 遍历mVexNum-1次;每次找出一个顶点的最短路径。
    for (i = 1; i < mVexNum; i++)
    {
        // 寻找当前最小的路径;
        // 即,在未获取最短路径的顶点中,找到离start最近的顶点(k)。
        min = INF;
        for (j = 0; j < mVexNum; j++)
        {
            if (flag[j] == 0 && dist[j] < min)
            {
                min = dist[j];
                k = j;
            }
        }
        // 标记"顶点k"为已经获取到最短路径
        flag[k] = 1;
        
        // 修正当前最短路径和前驱顶点
        // 即,当已经知道"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
        for (j = 0; j < mVexNum; j++)
        {
            tmp = (tempMatrix[k][j] == INF ? INF : (min + tempMatrix[k][j]));
            if (flag[j] == 0 && (tmp  < dist[j]))
            {
                dist[j] = tmp;
                prev[j] = k;
            }
        }
    }
}
#define MAX    100
#define INF    32767
int mVexNum;             // 顶点数
int mMatrix[MAX][MAX];   // 邻接矩阵
void floyd(int path[][MAX], int dist[][MAX])
{
    int i,j,k;
    int tmp;
    
    // 初始化
    for (i = 0; i < mVexNum; i++)
    {
        for (j = 0; j < mVexNum; j++)
        {
            dist[i][j] = mMatrix[i][j];    // "顶点i"到"顶点j"的路径长度为"i到j的权值"。
            path[i][j] = j;                // "顶点i"到"顶点j"的最短路径是经过顶点j。
        }
    }
    
    // 计算最短路径
    for (k = 0; k < mVexNum; k++)
    {
        for (i = 0; i < mVexNum; i++)
        {
            for (j = 0; j < mVexNum; j++)
            {
                // 如果经过下标为k顶点路径比原两点间路径更短,则更新dist[i][j]和path[i][j]
                tmp = (dist[i][k]==INF || dist[k][j]==INF) ? INF : (dist[i][k] + dist[k][j]);
                if (dist[i][j] > tmp)
                {
                    // "i到j最短路径"对应的值设,为更小的一个(即经过k)
                    dist[i][j] = tmp;
                    // "i到j最短路径"对应的路径,经过k
                    path[i][j] = path[i][k];
                }
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读