搜索“服务器”和最短路径

时间:2010-12-15 02:18:09

标签: c++ algorithm

我无法想出这个问题的解决方案。 我有组件(服务器)列表:
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 ++中开发

3 个答案:

答案 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代表一个无法到达的状态,谢谢Chris)

   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)的列。 冲洗重复。

对于文件格式,行中的值对应该没问题。