sicily 1024之递归与局部变量

来源:互联网 发布:mac 电视直播 编辑:程序博客网 时间:2024/06/05 04:12

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

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

阅读题目,发现有这么几个重点: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
原创粉丝点击