bfs+dfs乱搞+类似拓扑排序——cf1182D
代码不知道上了多少补丁。。终于过了
用类似拓扑排序的办法收缩整棵树得到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的更多相关文章
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧
xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...
- 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 ...
- 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 ...
- codeforces 638B—— Making Genome in Berland——————【类似拓扑排序】
Making Genome in Berland time limit per test 1 second memory limit per test 256 megabytes input stan ...
- hdu 5438(类似拓扑排序)
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- Ordering Tasks(拓扑排序+dfs)
Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the executio ...
- D2欧拉路,拓扑排序,和差分约束
第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
随机推荐
- 搭建WordPress博客程序库
搭建WordPress博客程序库 wordpress简介 wordpress是一套利用PHP语言和Mysql数据库开发的开源免费的Blog(博客,网站)程序,用户可以在支持PHP环境和Mysql数据库 ...
- 解决mac下,javac命令出现的乱码问题
今天突然检查我的jdk安装,发现出现了乱码 一,出现乱码
- ubuntu下网页视频或音频无法播放
有时,网页的音频或视频内容在 Firefox 下无法正常下载和播放.所需的插件没找到.过期.被阻止.和其他插件或扩展冲突,或者是内容由于某种原因被阻止.本文会帮助你解决这些问题. Flash 插件 F ...
- SpringBoot 之 Mybatis 逆向工程
今天给大家介绍在 spring- boot 项目中如何使用 maven 插件逆向工程生成 Mybatis 代码. pom.xml 添加依赖和插件 <dependency> <grou ...
- wpf tabcontrol内的datagrid的selectionChanged事件向往传递问题
tabcontrol 内的一个tabitem里是datagrid 当程序相应datagrid的selectionchanged事件后会向上传递到tabcontrol的selectionchanged事 ...
- leetcood学习笔记-102-二叉树的层次遍历
题目描述: 方法一; class Solution(object): def levelOrder(self, root): """ :type root: TreeNo ...
- leetcood学习笔记-169-求众数
题目描述: 方法一:排序输出中位数 class Solution(object): def majorityElement(self, nums): """ :type ...
- 导出Excel(终极版)
/** * 导出excel 案例 */ public void exportExcel(){ long beginTime = System.currentTimeMillis(); HttpServ ...
- 在IDEA安装SonarLint插件的步骤和使用方法
1.安装SonarLint插件方式 2.使用方式 3.效果
- bcc-tools工具之profile
profile是用于追踪程序执行调用流程的工具,类似于perf中的-g指令 相比perf -g而言,profile功能化更加细分,可以根据需要选择追踪层面,例如-U(用户要调用流程) -K (内核态调 ...