蓝桥杯2023年第十四届省赛真题-网络稳定性(纯暴力dfs,容易爆时间)

#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;
} 

这段代码数据少的样例可以过,但是数据量一大就直接爆时间了,也不清楚哪里可优化时间

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值