题目在这里点击打开链接。这道题求解的时候,我参考了这个代码点击打开链接
这是一道深搜的题目。刚开始看题就在纠结使用广搜还是深搜(也许是写的题不多,反应没那么快),后来发现广搜的话会给统计总距离带来很大的不变,而深搜可以利用递归和局部变量来很容易的解决。
阅读题目,发现有这么几个重点: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,想想也是必然的,因为数据越来越多,你不清楚,说不定就会造成死循环或者其他的耗时搜索