股票经纪人要在一群人(n个人的编号为0到n-1)中散布一个传言,传言只在认识的人中间传递。题目中给出了人与人的认识关系以及传言在某两个认识的人中传递所需的时间。编写程序求出以哪个人为起点可以在耗时最短的情况下人所有人都收到消息。 例如,n=4(人数),m=4(人数),4条边如下。 0 1 2 0 2 5 0 3 1 2 3 3请用Java解决
时间: 2024-01-21 07:19:45 浏览: 93
行业资料-交通装置-一种公路路基施工消解石灰散布车.zip
以下是Java的代码实现,使用Dijkstra算法求解最短路径:
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
class Edge {
int to;
int cost;
public Edge(int to, int cost) {
this.to = to;
this.cost = cost;
}
}
public class Main {
private static final int INF = Integer.MAX_VALUE / 2;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 人数
int m = scanner.nextInt(); // 认识关系数
ArrayList<Edge>[] graph = new ArrayList[n];
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int t = scanner.nextInt();
graph[a].add(new Edge(b, t));
graph[b].add(new Edge(a, t));
}
int ans = INF;
int start = -1;
for (int i = 0; i < n; i++) {
int[] dist = dijkstra(i, graph);
int maxDist = Arrays.stream(dist).max().getAsInt();
if (maxDist < ans) {
ans = maxDist;
start = i;
}
}
System.out.println(start);
}
private static int[] dijkstra(int start, ArrayList<Edge>[] graph) {
int n = graph.length;
int[] dist = new int[n];
Arrays.fill(dist, INF);
dist[start] = 0;
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> dist[a] - dist[b]);
queue.offer(start);
while (!queue.isEmpty()) {
int u = queue.poll();
for (Edge edge : graph[u]) {
int v = edge.to;
int newDist = dist[u] + edge.cost;
if (newDist < dist[v]) {
dist[v] = newDist;
queue.offer(v);
}
}
}
return dist;
}
}
```
输入格式如下:
```
4 4
0 1 2
0 2 5
0 3 1
2 3 3
```
其中第一行两个数分别表示人数和认识关系数,接下来的m行每行三个数分别表示两个人之间的认识关系和传递消息所需的时间。
输出为起点编号(从0开始)。对于样例输入,输出为:
```
0
```
阅读全文