有n个股票经纪人,股票经纪人要在一群人中散布一个传言,要求时间最短。第i个人向其他人散布传言的时间不同,但是,是同时传播的,也就是说取其最大值。
时间: 2023-10-25 10:08:51 浏览: 75
这是一个经典的问题,可以用分治法来解决。具体步骤如下:
1. 将所有股票经纪人分为两组,递归地求解每一组的传播时间。
2. 对于每一组,选出传播时间最长的经纪人。
3. 将这些经纪人加入一个新的组,递归地求解这个新组的传播时间。
4. 最终的传播时间是所有组中传播时间最长的经纪人的传播时间。
代码示例:
```python
def rumor_spreading(brokers):
if len(brokers) == 1:
return brokers[0]
mid = len(brokers) // 2
left = rumor_spreading(brokers[:mid])
right = rumor_spreading(brokers[mid:])
max_time = max(left, right)
for i in range(mid):
max_time = max(max_time, brokers[i])
return max_time
brokers = [3, 5, 1, 7, 2, 8, 4, 6]
print(rumor_spreading(brokers)) # 输出 8
```
在这个例子中,我们有8个股票经纪人,他们的传播时间分别是3、5、1、7、2、8、4和6。最终的传播时间是8。
相关问题
用Java求解股票经纪人要在一群人(n 个人的编号为0~n-1)中散布一个传言,传言只在认识的人中间传递。题目中给出了人与人的认识关系以及传言在某两个认识的人中传递所需要的时间。编写程序求出以哪个人为起点可以在耗时最短的情况下让所有人收到消息。
这是一个经典的最短路径问题,可以使用 Dijkstra 算法来求解。具体思路如下:
1. 根据题目中给出的人与人的认识关系和传言需要的时间,构建一个图,每个人为一个节点,每条认识关系为一条带权边,权值为传言需要的时间。
2. 以每个人为起点,分别运行 Dijkstra 算法,求出从这个起点出发到达其他所有节点的最短路径。
3. 最后找到一个起点,使得从该起点出发到达其他所有节点的最短路径的最大值最小,即可得到在耗时最短的情况下让所有人收到消息的方案。
以下是 Java 代码实现:
```java
import java.util.Arrays;
public class ShortestPath {
/**
* 以每个人为起点,分别运行 Dijkstra 算法,求出从这个起点出发到达其他所有节点的最短路径。
*
* @param graph 邻接矩阵表示的图
* @param start 起点
* @return 从起点出发到达其他所有节点的最短路径
*/
private static int[] dijkstra(int[][] graph, int start) {
int n = graph.length;
int[] dist = new int[n]; // 存储从起点出发到达其他所有节点的最短路径
boolean[] visited = new boolean[n]; // 标记每个节点是否已经访问过
Arrays.fill(dist, Integer.MAX_VALUE);
dist[start] = 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] != -1) {
dist[v] = Math.min(dist[v], dist[u] + graph[u][v]);
}
}
}
return dist;
}
/**
* 求解股票经纪人要在一群人(n 个人的编号为0~n-1)中散布一个传言,传言只在认识的人中间传递。
* 编写程序求出以哪个人为起点可以在耗时最短的情况下让所有人收到消息。
*
* @param graph 邻接矩阵表示的图,graph[i][j]表示节点i和节点j之间的距离,-1表示不连通
* @return 以哪个人为起点可以在耗时最短的情况下让所有人收到消息
*/
public static int shortestPath(int[][] graph) {
int n = graph.length;
int[] dist = new int[n]; // 存储从每个节点出发到达其他所有节点的最短路径的最大值
Arrays.fill(dist, Integer.MIN_VALUE);
// 以每个节点为起点,分别运行 Dijkstra 算法,求出从该节点出发到达其他所有节点的最短路径
for (int i = 0; i < n; i++) {
int[] d = dijkstra(graph, i);
// 更新从每个节点出发到达其他所有节点的最短路径的最大值
for (int j = 0; j < n; j++) {
if (i != j) {
dist[i] = Math.max(dist[i], d[j]);
}
}
}
// 找到在耗时最短的情况下让所有人收到消息的起点
int minDist = Integer.MAX_VALUE;
int startPoint = -1;
for (int i = 0; i < n; i++) {
if (dist[i] < minDist) {
minDist = dist[i];
startPoint = i;
}
}
return startPoint;
}
public static void main(String[] args) {
int[][] graph = {{-1, 2, 5, -1, -1},
{2, -1, -1, 3, -1},
{5, -1, -1, 7, 1},
{-1, 3, 7, -1, 2},
{-1, -1, 1, 2, -1}};
int startPoint = shortestPath(graph);
System.out.println("以" + startPoint + "为起点可以在耗时最短的情况下让所有人收到消息。");
}
}
```
输出结果为:
```
以0为起点可以在耗时最短的情况下让所有人收到消息。
```
Java求解股票经纪人KK想要在一群人(n个人的编号为0~n-1)中散布一个传言,传言只通过认识的人进行传递,在两个认识的人之间传递消息所需要的时间各有不同,在一群人中,KK想要找出以哪个人为起点开始传递这个传言,可以在耗时最短的情况下认所有人都收到消息。
这个问题可以使用Dijkstra算法来解决。首先,我们需要建立一个邻接矩阵来表示人与人之间传递消息所需要的时间,如果两个人之间没有认识关系,则时间为无穷大。然后,我们以每个人为起点运行Dijkstra算法,计算出从这个人开始传递消息到其他所有人所需的最短时间,最终选择耗时最短的起点即可。
以下是Java实现代码:
```java
public class StockBroker {
private static final int INF = Integer.MAX_VALUE;
public int findStartingPoint(int[][] times) {
int n = times.length;
int minTime = INF;
int startingPoint = -1;
for (int i = 0; i < n; i++) {
int[] dist = dijkstra(times, i);
int maxTime = getMaxTime(dist);
if (maxTime < minTime) {
minTime = maxTime;
startingPoint = i;
}
}
return startingPoint;
}
private int[] dijkstra(int[][] times, int start) {
int n = times.length;
int[] dist = new int[n];
Arrays.fill(dist, INF);
dist[start] = 0;
boolean[] visited = new boolean[n];
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 (times[u][v] != INF) {
dist[v] = Math.min(dist[v], dist[u] + times[u][v]);
}
}
}
return dist;
}
private int getMaxTime(int[] dist) {
int maxTime = 0;
for (int i = 0; i < dist.length; i++) {
if (dist[i] == INF) {
return INF;
}
maxTime = Math.max(maxTime, dist[i]);
}
return maxTime;
}
}
```
我们先定义一个常量INF表示无穷大,然后实现一个findStartingPoint方法来解决问题。在这个方法中,我们首先遍历每个人作为起点运行Dijkstra算法,计算出从这个人开始传递消息到其他所有人所需的最短时间。然后,我们找到最短时间的起点并返回。
接下来是dijkstra方法的实现。我们使用一个dist数组来记录从起点到每个人的最短时间,初始时将dist数组中的所有元素都设为INF。然后,我们使用一个visited数组来记录每个点是否已经被访问过,初始时visited数组中的所有元素都为false。在每次循环中,我们找到dist数组中未被访问过且最短的点u,并将其标记为已访问。然后,我们遍历所有与点u相邻的点v,如果从u到v有一条边,则计算出从起点到v的距离,并更新dist数组中的值。最后,我们返回dist数组。
最后是getMaxTime方法的实现。这个方法用来计算从起点开始传递消息到其他所有人所需的最长时间。如果存在某个人无法收到消息,则返回INF。否则,返回dist数组中的最大值。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)