股票经纪人要在一群人(n个人的编号为0~n-1)中散布一个传言,传言只在认识的人中间传递。题目中给出了人与人的认识关系以及传言在某两个认识的人中传递所需的时间。编写Java程序求出以哪个人为起点可以在耗时最短的情况下让所有人收到消息。
时间: 2024-02-03 08:12:32 浏览: 68
行业资料-交通装置-一种公路路基施工消解石灰散布车.zip
这是一个经典的图论问题,可以使用 Dijkstra 算法或 Floyd 算法来解决。
下面我们以 Dijkstra 算法为例,给出 Java 代码实现:
```java
import java.util.*;
public class StockBroker {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] graph = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
graph[i][j] = sc.nextInt();
}
}
int[] dist = new int[n];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[0] = 0;
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.comparingInt(i -> dist[i]));
queue.offer(0);
while (!queue.isEmpty()) {
int u = queue.poll();
for (int v = 0; v < n; v++) {
if (graph[u][v] > 0 && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
queue.offer(v);
}
}
}
int ans = 0;
for (int i = 1; i < n; i++) {
if (dist[i] > dist[ans]) {
ans = i;
}
}
System.out.println(ans);
}
}
```
输入格式为:
```
n
a[0][0] a[0][1] ... a[0][n-1]
a[1][0] a[1][1] ... a[1][n-1]
...
a[n-1][0] a[n-1][1] ... a[n-1][n-1]
```
其中 n 表示人数,a[i][j] 表示第 i 个人和第 j 个人之间是否认识(1 表示认识,0 表示不认识),如果认识则需要在他们之间传递消息的时间。
输出为起点编号,即可以让所有人收到消息的耗时最短的起点。
阅读全文