hihocoder(1050) 树中最长路径
2015-04-13 18:42
211 查看
树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解。
于是写了bfs的方法,其中0节点当作哨兵,每次从队列中取出0节点的时候,就知道一轮bfs结束,可以把深度加一。
bfs的思路很简单:
1.随便找一个节点,以该节点为起点进行一次bfs,得出的最后一个顶点,一定是直径的一端。
2.再以这个直径的一端为起点进行一次bfs,得出的直径的另一端,然后这两个端点之间即为直径(最长路径)。
刚开始老是WA,后来发现是因为忘记把顶点标记清零了。
View Code
于是写了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
相关文章推荐
- hihocoder1050 树中的最长路径
- hihoCoder 1050 : 树中的最长路 (dfs)
- [HihoCoder]#1050 : 树中的最长路
- 14、字串的连接最长路径查找
- 51nod 1274 最长递增路径【dp】
- CarrerCup-多叉树上的最长连续路径
- POJ2631 树最长路径dfsDP重写
- Palindromic Subsequence(最长回文字符串 输出路径)
- hihoCoder - 1081 - 最短路径·一:Dijkstra算法
- 算法竞赛入门经典 第二版 习题9-1最长滑雪路径 Longest Run on a Snowboard uva10285
- hdu 1160 dp (二维最长上升子序列 记录路径
- POJ 2533 Longest Ordered Subsequence(最长路径 dp)
- [HihoCoder]#1032 : 最长回文子串
- 华为OJ 初级:字串的连接最长路径查找
- hihocoder 1093 : 最短路径·三:SPFA算法
- cugb 1050 拦截导弹 (最长不升子序列)
- 华为OJ_1948_字串的连接最长路径查找(难:未完成)
- hdu 1160 最长上升子序列 + 记录路径
- 二叉树系列---找到累加和为指定值的最长路径长度
- SDUT 2498 AOE网上的关键路径(SPFA 最长路径)