您的位置:首页 > 其它

hihocoder(1050) 树中最长路径

2015-04-13 18:42 211 查看
树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解。

于是写了bfs的方法,其中0节点当作哨兵,每次从队列中取出0节点的时候,就知道一轮bfs结束,可以把深度加一。

bfs的思路很简单:

1.随便找一个节点,以该节点为起点进行一次bfs,得出的最后一个顶点,一定是直径的一端。

2.再以这个直径的一端为起点进行一次bfs,得出的直径的另一端,然后这两个端点之间即为直径(最长路径)。

刚开始老是WA,后来发现是因为忘记把顶点标记清零了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

vector<int> tree[100010];
bool used[100010];
int N;
int ans;

int bfs(int num)
{
ans = 0;
memset(used, 0, sizeof(used));
int point;
queue<int> q;
q.push(num);
q.push(0);
while (!q.empty()) {
int p = q.front();
q.pop();

if (p == 0 && !q.empty()) {
ans++;
q.push(0);
continue;
}
else if (p==0) {
break;
}

for (size_t i = 0; i < tree[p].size(); ++i) {
if (!used[tree[p][i]]) {
q.push(tree[p][i]);
used[tree[p][i]] = true;
}
}

point = p;
}

return point;
}

int main()
{
int u,v;
scanf("%d", &N);
for (int i = 1; i < N; ++i) {
scanf("%d%d", &u, &v);
tree[u].push_back(v);
tree[v].push_back(u);
}
bfs(bfs(1));
printf("%d\n", ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: