动态更新中
先贴模板(吉林大学的模板)
#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那个参数初始化为最大值
原文地址:http://blog.csdn.net/u011026968/article/details/35579035