求解股票经纪人问题[问题描述]股经纪人要在一群人(n 个人的编号为0~n-1)中散布一个传言,传言只在认识的人中间传递。题目中给出了人与人的认识关系以及传言在某两个认识的人中传递所需要的时间,编写程序求出以哪个人为起点可以在耗时最短的情况下让所有人收到消息 大验题 例如,n-4(人数),m=4(边数) 用C++
时间: 2024-02-12 13:05:43 浏览: 122
这是一个经典的图论问题,可以使用Dijkstra算法或者Floyd算法来解决。
以下是使用Dijkstra算法的代码实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
struct Edge {
int to;
int cost;
Edge(int t, int c) : to(t), cost(c) {}
};
typedef pair<int, int> P; // first:距离, second:节点编号
int n, m;
vector<Edge> G[100]; // 邻接表存图
int d[100]; // 起点到各点的距离
void dijkstra(int s) {
priority_queue<P, vector<P>, greater<P>> q; // 小根堆
fill(d, d + n, INF);
d[s] = 0;
q.push(P(0, s));
while (!q.empty()) {
P p = q.top();
q.pop();
int v = p.second;
if (d[v] < p.first) continue;
for (int i = 0; i < G[v].size(); i++) {
Edge e = G[v][i];
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
q.push(P(d[e.to], e.to));
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
G[a].push_back(Edge(b, c));
G[b].push_back(Edge(a, c)); // 无向图
}
int ans = INF;
for (int i = 0; i < n; i++) {
dijkstra(i);
int maxd = 0;
for (int j = 0; j < n; j++) {
if (d[j] == INF) {
maxd = INF; // 有人收不到消息
break;
}
maxd = max(maxd, d[j]);
}
ans = min(ans, maxd);
}
cout << ans << endl;
return 0;
}
```
输入格式为n和m,表示有n个人和m条认识关系,接下来m行每行三个整数a、b、c,表示编号为a和编号为b的人认识,传递消息需要的时间为c。输出为最短耗时,如果有人收不到消息则输出-1。
时间复杂度为O(n^2logn),空间复杂度为O(n+m)。
阅读全文