首页 > 代码库 > 单源最短路总结

单源最短路总结

动态更新中

先贴模板(吉林大学的模板)

#define INF 0x03F3F3F3F
const int N;
int path[N], vis[N];
void Dijkstra(int cost[][N], int lowcost[N], int n, int beg){
     int i, j, min;
     memset(vis, 0, sizeof(vis));
     vis[beg] = 1;
     for (i=0; i<n; i++){
      lowcost[i] = cost[beg][i]; path[i] = beg;
    }
    lowcost[beg] = 0;
    path[beg] = -1;  // 树根的标记
    int pre = beg;
    for (i=1; i<n; i++){
        min = INF;
        for (j=0; j<n; j++)
    // 下面的加法可能导致溢出,INF不能取太大
        if (vis[j]==0 && lowcost[pre]+cost[pre][j]<lowcost[j]){
            lowcost[j] = lowcost[pre] + cost[pre][j];
            path[j] = pre;
        }
        for (j=0; j<n; j++)
            if (vis[j] == 0 && lowcost[j] < min){
                min = lowcost[j]; pre = j;
            }
        vis[pre] = 1;
    }
}


一、注意题目中规定的源点到底是0还是n,以及0到底是不是顶点,看好自己的模板,别用错


二、注意输入的时候判重边

w=min(w,cost[u][v]);

三、单源最短路其实把<改为>是可以变成单源最长路的

如zoj 1655  每条路的权值是货物经损耗之后留下的比率,所以越大越好 

此时的初始化:将四、里的几处,按照题意相应做更改

四、最短路初始化:

cost[][]在读入之前初始化为最大值,lowcost[]初始化为最大值,另外在求最短路的过程中,min那个参数初始化为最大值