动态更新中
先贴模板(吉林大学的模板)
#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