sicily 1024之递归与局部变量

题目在这里点击打开链接。这道题求解的时候,我参考了这个代码点击打开链接

这是一道深搜的题目。刚开始看题就在纠结使用广搜还是深搜(也许是写的题不多,反应没那么快),后来发现广搜的话会给统计总距离带来很大的不变,而深搜可以利用递归和局部变量来很容易的解决。

阅读题目,发现有这么几个重点:1、城市是连通的,2、n个城市只有n-1条道路,那么是一个连通无环图。再加上n-1条道路,那么这是一颗树,可以把给出的capital作为树的根,进行深度搜索。

这道题的重点就是利用递归和局部变量,精简了很多费事的判断。

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;


struct Node{
	int m_city_x;
	int m_city_y;
	int m_weight;

	Node(int city_x, int city_y, int weight)
	{
		m_city_x = city_x;
		m_city_y = city_y;
		m_weight = weight;
	}
};

vector<Node> MI[10001];
bool color[10001];
int longest;


void dfs(int start, int dist)
{
	bool deeper = false;
	color[start] = true;

	for (vector<Node>::iterator iter = MI[start].begin(); iter != MI[start].end(); iter++)
	{
		if (color[iter->m_city_y] != true)
		{
			deeper = true;
			dfs(iter->m_city_y, dist + iter->m_weight);
		}
	}
	MI[start].clear();
	color[start] = false;
	if (deeper == false && dist > longest)
		longest = dist;
	return;
}

int main()
{
	int N, K, X, Y, D;
	Node *p;
	while (cin >> N >> K)
	{
		N--;
		while (N--)
		{
			cin >> X >> Y >> D;
			MI[X].push_back(Node(X, Y, D));
			MI[Y].push_back(Node(Y, X, D));
		}

		memset(color, false, sizeof(color));
		longest = 0;

		dfs(K, 0);

		cout << longest << endl;

	}
	//system("pause");
	return 0;
}
代码的重点1、dfs函数中deeper的运用,精简了判断某一节点是否是叶子节点的部分;2、dfs的第二个参数dist,这个运用可以恰当的保存每次迭代的总距离,从而在我们搜索到叶子的时候,也就得到了树根到叶子的距离

当然,这道题还有一个要注意的就是clear操作,毕竟不是一组数据,是很多组数据。写的时候就没注意clear, 导致给了TLE,想想也是必然的,因为数据越来越多,你不清楚,说不定就会造成死循环或者其他的耗时搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值