代码不知道上了多少补丁。。终于过了

用类似拓扑排序的办法收缩整棵树得到x,然后找到x直连的最远的和最近的点

只有这三个点可能是根,依次判一下即可

另外题解的第一种方法时找直径,然后判两端点+重心+所有直连重心的叶子节点,感觉这样子复杂度爆炸啊。。(如果是遍历所有叶子节点的话)

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
struct Edge{int to,nxt;}e[maxn<<];
int head[maxn],tot;
void init(){
memset(head,-,sizeof head);
tot=;
}
void add(int u,int v){
e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++;
}
int d[maxn],n,degree[maxn];
void dfs1(int u,int pre,int deep){
if(degree[u]>)return;
if(degree[u]==){
d[u]=deep;return;
}
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
dfs1(v,u,deep+);
}
} int dis[maxn];
int judge(int u){
queue<int>q;
memset(dis,,sizeof dis); q.push(u);dis[u]=;
int tmp1=,tmp2=degree[u];
while(q.size()){
int x=q.front();q.pop();
if(dis[x]!=tmp1){
tmp1=dis[x];
tmp2=degree[x];
}
else if(tmp2!=degree[x])return ;
for(int i=head[x];i!=-;i=e[i].nxt){
int y=e[i].to;
if(dis[y])continue;
dis[y]=dis[x]+;
q.push(y);
}
} return ;
} int main(){
init();
cin>>n;
if(n==){
puts("");
return ;
}
for(int i=;i<n;i++) {
int u,v;
cin>>u>>v;
add(u,v);add(v,u);
degree[u]++,degree[v]++;
} queue<int>q;
int cnt=,rt,tmp[maxn];
memcpy(tmp,degree,sizeof degree); for(int i=;i<=n;i++)
if(degree[i]==)
q.push(i),cnt++; while(cnt!=n){
int x=q.front();q.pop();
for(int i=head[x];i!=-;i=e[i].nxt){
int y=e[i].to;
if(tmp[y]==)continue;
else if(--tmp[y]==){
q.push(y);
cnt++;
if(cnt==n)rt=y;
}
}
} if(judge(rt)){cout<<rt;return ;} memset(d,,sizeof d);
for(int i=head[rt];i!=-;i=e[i].nxt){
int v=e[i].to;
dfs1(v,rt,);
}
int Max=,Min=,s=-;
for(int i=;i<=n;i++)
if(d[i] && Max<d[i]){
Max=d[i];s=i;
}
if(s!=-){
if(judge(s)){cout<<s;return ;}
} s=-;
for(int i=;i<=n;i++)
if(d[i] && Min>d[i]){
Min=d[i],s=i;
}
if(s!=-){
if(judge(s)){cout<<s;return ;}
} cout<<-;
}

bfs+dfs乱搞+类似拓扑排序——cf1182D的更多相关文章

  1. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  2. 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧

    xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...

  3. Codeforces Round #331 (Div. 2) E. Wilbur and Strings dfs乱搞

    E. Wilbur and Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596 ...

  4. Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】

    F. Contestants Ranking time limit per test:1 second memory limit per test:24 megabytes input:standar ...

  5. codeforces 638B—— Making Genome in Berland——————【类似拓扑排序】

    Making Genome in Berland time limit per test 1 second memory limit per test 256 megabytes input stan ...

  6. hdu 5438(类似拓扑排序)

    Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  7. Ordering Tasks(拓扑排序+dfs)

    Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the executio ...

  8. D2欧拉路,拓扑排序,和差分约束

    第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...

  9. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

随机推荐

  1. 搭建WordPress博客程序库

    搭建WordPress博客程序库 wordpress简介 wordpress是一套利用PHP语言和Mysql数据库开发的开源免费的Blog(博客,网站)程序,用户可以在支持PHP环境和Mysql数据库 ...

  2. 解决mac下,javac命令出现的乱码问题

    今天突然检查我的jdk安装,发现出现了乱码 一,出现乱码

  3. ubuntu下网页视频或音频无法播放

    有时,网页的音频或视频内容在 Firefox 下无法正常下载和播放.所需的插件没找到.过期.被阻止.和其他插件或扩展冲突,或者是内容由于某种原因被阻止.本文会帮助你解决这些问题. Flash 插件 F ...

  4. SpringBoot 之 Mybatis 逆向工程

    今天给大家介绍在 spring- boot 项目中如何使用 maven 插件逆向工程生成 Mybatis 代码. pom.xml 添加依赖和插件 <dependency> <grou ...

  5. wpf tabcontrol内的datagrid的selectionChanged事件向往传递问题

    tabcontrol 内的一个tabitem里是datagrid 当程序相应datagrid的selectionchanged事件后会向上传递到tabcontrol的selectionchanged事 ...

  6. leetcood学习笔记-102-二叉树的层次遍历

    题目描述: 方法一; class Solution(object): def levelOrder(self, root): """ :type root: TreeNo ...

  7. leetcood学习笔记-169-求众数

    题目描述: 方法一:排序输出中位数 class Solution(object): def majorityElement(self, nums): """ :type ...

  8. 导出Excel(终极版)

    /** * 导出excel 案例 */ public void exportExcel(){ long beginTime = System.currentTimeMillis(); HttpServ ...

  9. 在IDEA安装SonarLint插件的步骤和使用方法

    1.安装SonarLint插件方式 2.使用方式 3.效果

  10. bcc-tools工具之profile

    profile是用于追踪程序执行调用流程的工具,类似于perf中的-g指令 相比perf -g而言,profile功能化更加细分,可以根据需要选择追踪层面,例如-U(用户要调用流程) -K (内核态调 ...