最短路径算法 我想要得到一个图的最短路径,两点间权值相同的最短路径可能不止一条,用哪种算法可以得到全部的最短路径呢???? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 最短路径的ijkstra算法: public void Dijkstra(int v0) { int s[] = new int[MaxVertices]; int v, i, j, w; /* 初始化s、dist和path */ for (v = 0; v < CurrentVertices; v++) { s[v] = 0; /* 0表示还未求出最短路径 */ /* 一开始假定取直达路径最短 */ dist[v] = Edge[v0][v]; /* 直达情况下的最后经由点就是出发点 */ if(dist[v] < MaxValue) path[v] = v0; else path[v] = -1; /* 无直达路径 */ } /* 初始时源点v0∈S集,表示v0到v0的最短路径已经找到 */ dist[v0] = 0; s[v0] = 1; // 下来假设经由一个点中转到达其余各点,会近些,验证之. // 再假设经由两个点中转,会更近些,验证之,..... // 直到穷举完所有可能的中转点. double min; for (i = 1; i < CurrentVertices - 1; i++) { // 挑一个距离最近经由点,下标装入v min = MaxValue; for (w = 0; w < CurrentVertices; w++) /* 顶点w不属于S集且离v0更近 */ if(s[w] == 0 && dist[w] < min) { v = w; /* 经由顶点w中转则距离更短 */ min = dist[w]; } s[v] = 1; /* * 顶点v并入S, * 由v0到达v顶点的最短路径为min */ /* * 假定由v0到v,再由v直达其余各点, * 更新当前最后一个经由点及距离 */ for (j = 0; j < CurrentVertices - 1; j++) if(s[j] == 0 && (min + Edge[v][j] < dist[j])) { /* * 如果多经由一个v点到达j点的 * 最短路径反而要短,就更新. */ dist[j] = min + Edge[v][j]; path[j] = v; /* 经由点的序号 */ }/* if */ }/* 循环for i */ }/* Dijkstra算法结束 */ BFS->Dijkstra->A*->IDA*需要看收集蛮多资料,然后自己慢慢消化掉吧. 关于javax.swing.text.html.HTMLEditorKit.ParserCallBack 里方法用法 高手给写个东西撒! 延时函数 InetAddress的一个疑问 求助:JNI中中文的问题该如何解决啊??(急) 只要会操纵数据库,就会短信编程 关于Object.wait(long t)的问题,请指教 求救,看看这个程序那错了。。。 向大家请教一个绝对简单的问题 java提取特定字符串求助 高分求一SWT编译不通过 泛型类申明对象, 和课本一样的代码, 课本的运行结果是“一只小狗 一只小花猫” ,可实际上根本不能运行,是哪里出错了呢。
// 最短路径的ijkstra算法:
public void Dijkstra(int v0) {
int s[] = new int[MaxVertices];
int v, i, j, w;
/* 初始化s、dist和path */
for (v = 0; v < CurrentVertices; v++) {
s[v] = 0; /* 0表示还未求出最短路径 */
/* 一开始假定取直达路径最短 */
dist[v] = Edge[v0][v];
/* 直达情况下的最后经由点就是出发点 */
if(dist[v] < MaxValue)
path[v] = v0;
else
path[v] = -1; /* 无直达路径 */
}
/* 初始时源点v0∈S集,表示v0到v0的最短路径已经找到 */
dist[v0] = 0;
s[v0] = 1;
// 下来假设经由一个点中转到达其余各点,会近些,验证之.
// 再假设经由两个点中转,会更近些,验证之,.....
// 直到穷举完所有可能的中转点.
double min;
for (i = 1; i < CurrentVertices - 1; i++) {
// 挑一个距离最近经由点,下标装入v
min = MaxValue;
for (w = 0; w < CurrentVertices; w++)
/* 顶点w不属于S集且离v0更近 */
if(s[w] == 0 && dist[w] < min) {
v = w; /* 经由顶点w中转则距离更短 */
min = dist[w];
}
s[v] = 1; /*
* 顶点v并入S,
* 由v0到达v顶点的最短路径为min
*/
/*
* 假定由v0到v,再由v直达其余各点,
* 更新当前最后一个经由点及距离
*/
for (j = 0; j < CurrentVertices - 1; j++)
if(s[j] == 0 && (min + Edge[v][j] < dist[j])) {
/*
* 如果多经由一个v点到达j点的
* 最短路径反而要短,就更新.
*/
dist[j] = min + Edge[v][j];
path[j] = v; /* 经由点的序号 */
}/* if */
}/* 循环for i */
}/* Dijkstra算法结束 */
需要看收集蛮多资料,然后自己慢慢消化掉吧.