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

用类似拓扑排序的办法收缩整棵树得到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. creat-react-app搭建的项目中按需引入antd以及配置Less和如何修改antd的主题色

    在creat-react-app搭建的项目环境中按需引入antd以及配置less,首先需要暴露出来webpack文件.(此操作不可逆). create-react-app myapp 创建同一个rea ...

  2. u-boot 移植工作目录

    1. 添加工作用户 [root@localhost ~]#useradd -G root -g root -d/home/uboot uboot 2. 建立工作目录 [uboot@localhost ...

  3. Go学习笔记:Linux下安装Go语言

    CentOS7.6安装Go-1.12.9版本 1. 下载安装包到当前目录下> wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz2 ...

  4. Codeforces346D. Robot Control

    D. Robot Control time limit per test 6 seconds memory limit per test 256 megabytes input standard in ...

  5. 1.MySQL基础架构

    好久没发博客了,终于又学完了一点知识并且进行了整理.就从这个MySQL系列开始继续坚持每个月产出几篇. 声明一下,这次的MySQL系列是针对已有一定基础的小伙伴的,关于SQL的使用,一些概念的介绍就不 ...

  6. java-----Long转换为 int , string

    int: 1.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 2.先把long转换成字符串String,然后在转行成 ...

  7. jQuery - DOM相关

    1. 操作文本 console.log($("#t1").html()); // 获取span元素中的内容, 包含html标签 $("#t1").html(&q ...

  8. 去除springboot内置tomcat

    /** * @author zx * @title: ServletInitializer * @projectName activiti * @description: 解决内置tomcat * @ ...

  9. HDU4578-代码一点都不长的线段树

    (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  4种操作,1:区间加法,2:区间乘法,3:区间的所有数都变成一个数,4:访问区间每个数的p次方 ...

  10. PostgreSQL/GREENPLUM关联更新

    update a_t AA set /*AA.*/ sqlstr = 'qqq' from a_t BB where aa.id <> BB.id and aa.name = BB.nam ...