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 ...
随机推荐
- JS点击2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Comparable和Comparator接口是干什么的?列出它们的区别
Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象. Java提供了 ...
- 自定义实现系统max方法
function MyMath(){ //添加了一个方法 this.getMax=function(){ //所有数字中的最大值 var max=arguments[0]; for(var i=0;i ...
- 5.Struts2框架中的ServletAPI如何获取
1.完全解耦合的方式 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API 一些常用的方法如下 * static A ...
- sql 左连接与右连接
假设有A,B两个表. 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID ...
- selenium 操作键盘事件
一.key包提供按键方法 使用必须先引用key包:from selenium.webdriver.common.keys import Keys 键盘事件,在现实操作中我们习惯性的按tab见切换到写一 ...
- python-面向对象-01课堂笔记
面向对象 ''''1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 ...
- 「题解」:x
问题 A: x 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...
- Delphi提取EXE,DLL文件图标
//uses ShellAPIprocedure TForm1.Button1Click(Sender: TObject);var IconIndex:Word; h:hICON;begin Icon ...
- Delphi exe实例之间传递cmd参数
{Unit1.pas} 通过这个单元的Button,调用另一个实例: procedure TForm1.Button1Click(Sender: TObject); begin ShellExecut ...