我无法想出这个问题的解决方案。
我有组件(服务器)列表:
2 - 8
8 - 3
3 - 9
.....
所以这意味着theese服务器是链接的,您可以从任何其他服务器开始访问所有服务器 - 所有服务器都通过其他服务器链接。
问题是如何找出哪一个/哪个服务器具有访问所有其他服务器的最短路径(步数)。每个链接都被视为一步
例如:
1 - 2
2 - 7
2 - 8
2 - 9
2 - 3
3 - 4
4 - 5
4 - 6
答:服务器编号3最多需要2步才能访问所有其他服务器。
哪个是最佳解决方案?选择哪种数据结构来保存/读取文件中的数据,如下所示?
P.S此任务将在C ++中开发
答案 0 :(得分:5)
您想要的是所谓的图形中心。您的算法文本可能会讨论它以及所有对最短路径算法(Floyd-Warshall和Johnson的算法)。 Here是一个简短的讨论
答案 1 :(得分:2)
您绝对希望将此数据表示为图表。具体来说,您需要distance matrix。
您可以使用Floyd-Warshall算法填充此矩阵。
基本上对于固定数量的服务器,N,做(不完全代码):
int dist[N][N];
fill(dist, N + 1);
for (i = [0,N)) dist[i][i] = 0;
foreach (edge e) dist[e.first][e.second] = dist[e.second][e.first] = 1
for (k = [0,N))
for (j = [0,N))
for (i = [0,N))
dist[j][i] = min(dist[j][i], dist[j][k] + dist[k][i])
然后dist[i][j]
保持从服务器i到服务器j的距离。使用填充的距离矩阵,确定图的中心是微不足道的。
答案 2 :(得分:1)
1 2 3 4 5 6 7 8 9
1 0 1 -1 -1 -1 -1 -1 -1 -1
2 1 0 1 -1 -1 -1 1 1 1
3 -1 1 0 1 -1 -1 -1 -1 -1
4 -1 -1 1 0 1 1 -1 -1 -1
5 -1 -1 -1 1 -1 -1 -1 -1 -1
6 -1 -1 -1 1 -1 -1 -1 -1 -1
7 -1 1 -1 -1 -1 -1 -1 -1 -1
8 -1 1 -1 -1 -1 -1 -1 -1 -1
9 -1 1 -1 -1 -1 -1 -1 -1 -1
然后填写两个, 例如。对于第1列和第1行,放入2,其中第2列有一个(忽略1),即3 7 8和9.所以对于第一列/行
1 2 3 4 5 6 7 8 9
1 0 1 2 -1 -1 -1 2 2 2
2 1 0 1 -1 -1 -1 1 1 1
3 2 1 0 1 -1 -1 -1 -1 -1
4 -1 -1 1 0 1 1 -1 -1 -1
5 -1 -1 -1 1 -1 -1 -1 -1 -1
6 -1 -1 -1 1 -1 -1 -1 -1 -1
7 2 1 -1 -1 -1 -1 -1 -1 -1
8 2 1 -1 -1 -1 -1 -1 -1 -1
9 2 1 -1 -1 -1 -1 -1 -1 -1
重复三次。查看距离为2(3,7,8,9)的列。 冲洗重复。
对于文件格式,行中的值对应该没问题。