请使用floyd完成以下c++题目: 输入格式 第一行两个正整数 n,m。 接下来 m 行,每行有三个数 a,b,v 表示一条连接 a,b 的无向边。 接下来一行一个正整数 q。 接下来 q 行,每行是两个数 1 a 或是三个数 2 a b 1 a表示删除a号节点 2 a b 表示查询a号节点和b号节点之间的最短路 其中2 <= k <= n <= 100000, m <= 100000
时间: 2024-04-12 15:28:54 浏览: 86
C++求所有顶点之间的最短路径(用Floyd算法)
以下是使用Floyd算法来解决这个问题的C++代码示例:
```cpp
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
const int INF = INT_MAX;
void floyd(vector<vector<int>>& graph, int n) {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][k] != INF && graph[k][j] != INF && graph[i][k] + graph[k][j] < graph[i][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n + 1, vector<int>(n + 1, INF));
// 初始化图
for (int i = 1; i <= n; i++) {
graph[i][i] = 0;
}
// 读取边的信息
for (int i = 0; i < m; i++) {
int a, b, v;
cin >> a >> b >> v;
graph[a][b] = v;
graph[b][a] = v;
}
// 使用Floyd算法求解最短路径
floyd(graph, n);
int q;
cin >> q;
// 处理查询
while (q--) {
int type, a, b;
cin >> type >> a;
if (type == 1) {
// 删除节点a
for (int i = 1; i <= n; i++) {
graph[a][i] = INF;
graph[i][a] = INF;
}
} else if (type == 2) {
// 查询节点a和b之间的最短路径
cin >> b;
cout << (graph[a][b] == INF ? -1 : graph[a][b]) << endl;
}
}
return 0;
}
```
该代码通过使用Floyd算法来计算给定图中任意两个节点之间的最短路径。它可以处理删除节点的操作和查询最短路径的操作。请确保输入的数据满足题目要求,并按照题目格式进行输入。
阅读全文