本文共 2560 字,大约阅读时间需要 8 分钟。
多源最短路径问题是指在一个图中,从多个起点同时出发,找到到所有其他节点的最短路径。这一问题在交通路线规划、网络设计等领域有广泛应用。
Floyd算法(也称为Floyd-Warshall算法)是一种经典的全局规划算法。它的主要优势包括:
图的表示:
road存储各节点之间的距离,初始化为-1表示未计算。输入处理:
Floyd算法核心实现:
k,更新i到j的最短路径。查询处理:
void search() { for (int k = 0; k < cnt; ++k) { for (int i = 0; i < cnt; ++i) { for (int j = 0; j < cnt; ++j) { if (road[i][k] != -1 && road[k][j] != -1) { if (road[i][j] == -1) { road[i][j] = road[i][k] + road[k][j]; } else { road[i][j] = min(road[i][j], road[i][k] + road[k][j]); } } } } }} int find(string pos) { for (int i = 0; i < cnt; ++i) { if (node[i] == pos) { return i; } } node[cnt] = pos; cnt++; return cnt - 1;}int find2(string pos) { for (int i = 0; i < cnt; ++i) { if (node[i] == pos) { return i; } } return -1;} int main() { int c; cin >> c; while (c--) { for (int i = 0; i < 1500; ++i) { node[i] = ""; } for (int i = 0; i < 1500; ++i) { for (int j = 0; j < 1500; ++j) { road[i][j] = -1; } } for (int i = 0; i < 1500; ++i) { road[i][i] = 0; } cnt = 0; string s, t; int d; cin >> n; for (int i = 0; i < n; ++i) { cin >> s >> t >> d; int a = find(s); int b = find(t); road[a][b] = d; road[b][a] = d; } search(); cin >> s >> t; int a = find2(s); int b = find2(t); if (a == -1 || b == -1) { if (s == t) { cout << 0 << endl; } else { cout << -1 << endl; } } else { cout << road[a][b] << endl; } }} 初始化:
node数组存储节点名称。road二维数组存储节点间距离,初始化为-1表示未计算。输入处理:
n,逐个读取边的信息,更新road数组。Floyd算法运行:
查询处理:
通过上述方法,我们可以有效地解决多源最短路径问题。Floyd算法的多次路径放松确保了计算的准确性,同时能够处理图中存在负权重边的情况。在实际应用中,可以根据具体需求调整算法参数,进一步优化性能。
转载地址:http://xcnyz.baihongyu.com/