#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<unordered_map>
#define INF 0x3f3f3f3f//初始化INF为int类型最大值
using namespace std;
struct Node { //构建树的结点
int value; //结点的编号
vector <Node*> node;//存储链接的结点
vector <int> length;//存储边的权值
};
unordered_map <int, Node*> map1;//键是结点编号,值是对应的结点,方便添加或查找
int n, m, q;
int ans = -1; //初始化答案为-1
unordered_map <Node*, bool> map2;//map2用来标记某个结点是否被访问过
void dfs(int a, int b, int sum)//a是起始结点,b是终点结点,sum是当前的稳定性
{
if (a == b) {//如果递归到目标结点
ans = max(ans, sum);
return;
}
map2[map1[a]] = true;//父节点已经访问
for (int i = 0; i < map1[a]->node.size(); i++) {
Node* node2 = map1[a]->node[i]; //node2用来存储子结点
if (map2.count(node2) && map2[node2]) continue; //如果当前的结点未访问,就接着访问下一个结点
//另外说明一点,&&运算符如果在某个条件被判断为0,就直接跳过,不会访问到下一个条件,因此不用担心在没有初始化的map2中出错
map2[node2] = true; //该结点已经被访问
dfs(node2->value, b, min(sum, map1[a]->length[i]));//递归到下一层
}
return;//如果访问所有结点都没有访问到目标结点,就直接返回
}
int main(void)
{
cin >> n >> m >> q;
vector <Node> node1(n + 5);//一共有n个结点(防止越界)
for (int i = 1; i <= n; i++) {
node1[i].value = i;//存储编号
map1[i] = &node1[i];//存储结点
}
for (int i = 1; i <= m; i++) {
int a, b, c; cin >> a >> b >> c; //用来存储两个结点和边权值
map1[a]->node.push_back(map1[b]);
map1[a]->length.push_back(c);
map1[b]->node.push_back(map1[a]);
map1[b]->length.push_back(c);//因为是无向树,因此要分别存储
}
while (q--) {
int a, b; cin >> a >> b;
map2.clear();//清空状态判断
ans = -1; //初始化ans
dfs(a, b, INF);
cout << ans << endl;
}
return 0;
}
这段代码数据少的样例可以过,但是数据量一大就直接爆时间了,也不清楚哪里可优化时间