【树的直径】 ZJU 3820 Building Fire Stations
来源:互联网 发布:电子cad软件 编辑:程序博客网 时间:2024/06/10 07:29
先找到树的直径 len 再将直径均匀分成两根。。
如果不能平分则需要比较 max((len/2 和len/2-1 ),(len/2 和len/2+1 ))
#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <iostream>#include <algorithm>#include <sstream>#include <cmath>using namespace std;#include <queue>#include <stack>#include <vector>#include <deque>#define cler(arr, val) memset(arr, val, sizeof(arr))#define FOR(i,a,b) for(int i=a;i<=b;i++)#define IN freopen ("in.txt" , "r" , stdin);#define OUT freopen ("out.txt" , "w" , stdout);typedef long long LL;const int MAXN = 200000;const int MAXM = 200000;const int INF = 0x3f3f3f3f;const int mod = 1000000007;const double eps= 1e-8;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Edge{ int to,next;} edge[MAXN*2];int head[MAXN],pre[MAXN],d[MAXN],tol;bool vis[MAXN];void init(){ tol=0; memset(head,-1,sizeof(head));}void addedge(int u,int v){ edge[tol].to=v,edge[tol].next=head[u]; head[u]=tol++; edge[tol].to=u,edge[tol].next=head[v]; head[v]=tol++;}int bfs(int u,int no){ int point=u,big=0; memset(vis,false,sizeof(vis)); queue<int>q; q.push(u); vis[u]=vis[no]=true; pre[u]=-1; d[u]=1; while(!q.empty()) { u=q.front(); q.pop(); for(int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].to; if(!vis[v]) { d[v]=d[u]+1; pre[v]=u; if(d[v]>big) { big=d[v]; point=v; } vis[v]=true; q.push(v); } } } return point;}void solve(int s,int e,int &out1,int &out2,int &ans){ int u,v; u=bfs(s,e); v=bfs(u,e); int star[MAXN]; int len1=0,tmp; tmp=v; while(tmp!=-1) { star[len1++]=tmp; tmp=pre[tmp]; } out1=star[(len1)/2]; ans=(len1)/2; u=bfs(e,s); v=bfs(u,s); int len2=0; tmp=v; while(tmp!=-1) { star[len2++]=tmp; tmp=pre[tmp]; } out2=star[(len2)/2]; ans=max(ans,len2/2);}int main(){#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout);#endif int t,a,b,n; scanf("%d", &t); while(t--) { int star[MAXN]; init(); scanf("%d", &n); for(int i=0; i<n-1; i++) { scanf("%d%d",&a,&b); addedge(a,b); } int u=bfs(1,n+1); int v=bfs(u,n+1); int tmp,num=0,ans,out1,out2; int len=0; tmp=v; while(tmp!=-1) { star[len++]=tmp; tmp=pre[tmp]; } int s=star[(len)/2]; int e=star[(len)/2-1]; solve(s,e,out1,out2,ans); if(len%2==1) { int s=star[(len)/2]; int e=star[(len)/2+1]; int out3,out4,ans2; solve(s,e,out3,out4,ans2); if(ans2>ans) out1=out3,out2=out4; } printf("%d %d %d\n",ans,out1,out2); } return 0;}
0 0
- 【树的直径】 ZJU 3820 Building Fire Stations
- 【ZOJ】3820 Building Fire Stations 树的直径
- zoj 3820 Building Fire Stations (树的直径)
- zoj 3820 Building Fire Stations (二分+树的直径)
- ZOJ 3820 Building Fire Stations(树的直径+操作)
- zoj 3820 Building Fire Stations (求树的直径)
- ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】
- ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS
- ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】
- zoj 3820 Building Fire Stations The 2014 ACM-ICPC Asia Mudanjiang Regional Contest B题 树的直径
- 2014-2015icpc 牡丹江 B.Building Fire Stations (二分+树的直径)
- 【ZOJ】 3820 Building Fire Stations
- ZOJ 3820 Building Fire Stations
- ZOJ - 3820 Building Fire Stations
- ZOJ 3820 Building Fire Stations
- ZOJ 3820 Building Fire Stations(树上的问题)
- ZOJ 3820Building Fire Stations 树的最长链性质(拓展)
- ZOJ 3820 Building Fire Stations (二分)
- 优化Mysql的运行环境(Linux)
- 协同过滤
- ubuntu下终端路径只显示当前目录
- Linux设备模型——设备驱动模型和sysfs文件系统解读
- PHP与MYSQL中UTF8 中文排序例子
- 【树的直径】 ZJU 3820 Building Fire Stations
- mongodb学习笔记2,mongodb的查询
- JAVA学习第三十三课(常用对象API) —迭代器
- strcpy函数的实现
- Leetcode Simplify Path
- python 定义函数
- PHP之道
- Android代码优化(一)
- 记忆深刻的菱形结构