#1050 : 树中的最长路(两次BFS)
2015-10-09 00:17
176 查看
题目链接:点击打开链接
题意描述:求树上的最长路?
解题思路:任找一点u作为根节点BFS找出距离该点最远的点v,然后以v为根节点BFS可找出树上的最长路
代码:
题意描述:求树上的最长路?
解题思路:任找一点u作为根节点BFS找出距离该点最远的点v,然后以v为根节点BFS可找出树上的最长路
代码:
#include <cstdio> #include <cstring> #include <queue> #define MAXN 100010 #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int head[MAXN],tol; struct Edge{ int v,next; }e[MAXN*2]; void addEdge(int u,int v){ e[tol].v=v;e[tol].next=head[u];head[u]=tol++; e[tol].v=u;e[tol].next=head[v];head[v]=tol++; } struct node{ int u,dis; node(int u,int dis):u(u),dis(dis){} }; queue<node> q; bool vis[MAXN]; int n; int bfs(int u,int& ans){ while(!q.empty()) q.pop(); q.push(node(u,0)); vis[u]=true; while(!q.empty()){ node tmp=q.front();q.pop(); u=tmp.u; ans=tmp.dis; int v; for(int k=head[u];k!=-1;k=e[k].next){ v=e[k].v; if(!vis[v]){ vis[v]=true; q.push(node(v,tmp.dis+1)); } } } return u; } int main(){ scanf("%d",&n); tol=0;mem(head,-1); int u,v; for(int i=1;i<n;++i){scanf("%d%d",&u,&v);addEdge(u,v);} int ans; mem(vis,false); u=bfs(1,ans); mem(vis,false); bfs(u,ans); printf("%d\n",ans); return 0; }
相关文章推荐
- URLConnection的一些用法
- IOS中JSON数据的解析
- 约瑟夫环问题-Java数组解决
- 读完《visual c++网络编程》 唐文超编著后的领悟
- Linux makefile 教程(转载学习)
- URL入门
- 简述Windows XP与Windows 7系统常见漏洞
- 【leetcode】290. Word Pattern
- JS+THREE.js
- 图解HTTP学习笔记——简单的HTTP协议
- Java JVM(十二):指令重排序
- JDBC查询条件中包含中文,无查询结果(编码问题)
- android-contentprovider
- Nmap速查手册
- zabbix 自定义discovery
- codeforces584B Kolya and Tanya
- 监控 MySQL的多种方法
- C#单元测试
- boost::ref
- SVG彩虹字