博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hihocoder(1050) 树中最长路径
阅读量:6564 次
发布时间:2019-06-24

本文共 1329 字,大约阅读时间需要 4 分钟。

树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解。

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

bfs的思路很简单:

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

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

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

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 9 vector
tree[100010];10 bool used[100010];11 int N;12 int ans;13 14 int bfs(int num)15 {16 ans = 0;17 memset(used, 0, sizeof(used));18 int point;19 queue
q; 20 q.push(num);21 q.push(0);22 while (!q.empty()) {23 int p = q.front();24 q.pop();25 26 if (p == 0 && !q.empty()) {27 ans++;28 q.push(0); 29 continue;30 }31 else if (p==0) {32 break;33 }34 35 for (size_t i = 0; i < tree[p].size(); ++i) {36 if (!used[tree[p][i]]) {37 q.push(tree[p][i]);38 used[tree[p][i]] = true;39 }40 }41 42 point = p;43 }44 45 return point;46 }47 48 int main()49 {50 int u,v;51 scanf("%d", &N);52 for (int i = 1; i < N; ++i) {53 scanf("%d%d", &u, &v);54 tree[u].push_back(v);55 tree[v].push_back(u);56 }57 bfs(bfs(1));58 printf("%d\n", ans);59 return 0;60 }
View Code

 

转载于:https://www.cnblogs.com/sheepsheep/p/4422945.html

你可能感兴趣的文章
Centos7.1环境下搭建BugFree
查看>>
共用y轴的双图形绘制
查看>>
第31讲 | 数字货币钱包服务
查看>>
P2073 送花
查看>>
iOS端项目注释规范附统一代码块
查看>>
c语言编程的限制,关于NOI系列赛编程语言使用限制的规定
查看>>
32个c语言关键字发音,C语言的32个关键字(读音、用法、注释)转来的,给刚接触C的...
查看>>
为煮酒新书《构建高可用Linux服务器》作序!
查看>>
Windows Azure中文博客 Windows Azure入门教学系列 (一): 创建第一个WebRole程序
查看>>
Linux学习之CentOS(四)----Linux各目录的介绍
查看>>
HTTP深入浅出 http请求
查看>>
为YUM设置代理的方法
查看>>
Java 编程的动态性 第1 部分: 类和类装入--转载
查看>>
【转】持久化消息队列之MEMCACHEQ
查看>>
Dom4j学习笔记
查看>>
C语言 HTTP上传文件-利用libcurl库上传文件
查看>>
[MEAN Stack] First API -- 7. Using Route Files to Structure Server Side API
查看>>
调试逆向分为动态分析技术和静态分析技术(转)
查看>>
Android webview使用详解
查看>>
业务对象和BAPI
查看>>