股票经纪人要在一群人(n个人的编号为0~n-1)中散布一个传言,传言只在认识的人中间传递。题目中给出了人与人的认识关系以及传言在某两个认识的人中传递所需要的时间。编写程序求出以哪个人为起点可以在耗时最短的情况下让所有人收到消息。用JAVA解决
时间: 2024-01-21 08:17:10 浏览: 59
这是一个典型的最短路径问题,可以使用Dijkstra算法来解决。
具体实现过程如下:
1. 定义一个邻接矩阵graph表示人与人之间的认识关系,其中graph[i][j]表示第i个人到第j个人是否认识,如果认识则为1,否则为无穷大。
2. 定义一个距离数组dist表示从起点到每个人的最短时间,初始化为无穷大,起点的距离为0。
3. 定义一个visited数组表示每个人是否已经被访问过,初始化为false。
4. 从起点开始,依次访问与起点相邻的人,更新距离数组dist和visited数组。
5. 重复上述步骤,直到所有人都被访问过。
6. 找到距离数组dist中的最大值,即为耗时最短的时间。
7. 返回起点编号。
代码实现如下:
```java
public class ShortestPath {
public static int shortestPath(int[][] graph) {
int n = graph.length;
int[] dist = new int[n];
boolean[] visited = new boolean[n];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[0] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u]))
u = j;
}
visited[u] = true;
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] != Integer.MAX_VALUE) {
dist[v] = Math.min(dist[v], dist[u] + graph[u][v]);
}
}
}
int maxDist = 0;
for (int i = 0; i < n; i++) {
maxDist = Math.max(maxDist, dist[i]);
}
return maxDist == Integer.MAX_VALUE ? -1 : Arrays.stream(dist).boxed().collect(Collectors.toList()).indexOf(maxDist);
}
public static void main(String[] args) {
int[][] graph = new int[][]{
{0, 1, Integer.MAX_VALUE, 3},
{1, 0, 2, Integer.MAX_VALUE},
{Integer.MAX_VALUE, 2, 0, 1},
{3, Integer.MAX_VALUE, 1, 0}
};
System.out.println(shortestPath(graph)); // 0
}
}
```
在上述代码中,我们使用了Java 8的Stream API来查找最大距离在距离数组中的下标。如果最大距离为无穷大,则说明有人无法收到消息,返回-1即可。
阅读全文