第一行有四个用空格隔开的 � n, � m, � s, � t,其含义见【题目描述】。 接下来 � m 行,每行三个整数 � , � , � u,v,w,表示有一条大道连接区 � u 和区 � v,且拥挤度为 � w。 两个区之间可能存在多条大道。用bfs来做
时间: 2024-04-08 14:32:57 浏览: 86
你可以使用广度优先搜索(BFS)来解决这个问题。下面是使用BFS的代码实现:
```cpp
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N = 1e4+10, M = 9999999;
int n, m, s, t;
int dist[N], path[N];
bool visited[N];
vector<pair<int, int>> graph[N];
void bfs(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
dist[start] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto edge : graph[u]) {
int v = edge.first;
int w = edge.second;
if (!visited[v]) {
visited[v] = true;
dist[v] = dist[u] + w;
path[v] = u;
q.push(v);
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
graph[v].push_back({u, w});
}
for (int i = 1; i <= n; i++) {
dist[i] = M;
visited[i] = false;
}
bfs(s);
cout << dist[t] << endl;
return 0;
}
```
这段代码首先定义了节点数量 `n`,边数量 `m`,起点 `s` 和终点 `t`。然后使用邻接表 `graph` 来存储图的边信息。
在 `bfs` 函数中,我们使用队列来进行广度优先搜索。初始时将起点入队,并标记为已访问。然后开始循环,直到队列为空。对于每个出队的节点 `u`,遍历其邻接节点 `v`,如果 `v` 尚未访问,则将其入队,更新距离和路径,并标记为已访问。
最后,在主函数中读入输入,初始化距离数组和访问数组,然后调用 `bfs` 函数进行广度优先搜索。最终输出从起点到终点的最短距离。
希望这个解法能够帮助到你!
阅读全文