hihocoder1490 Tree Restoration 模拟
There is a tree of N nodes which are numbered from 1 to N. Unfortunately, its edges are missing so we don't know how the nodes are connected. Instead we know:
1. Which nodes are leaves
2. The distance (number of edges) between any pair of leaves
3. The depth of every node (the root's depth is 1)
4. For the nodes on the same level, their order from left to right
Can you restore the tree's edges with these information? Note if node u is on the left of node v, u's parent should not be on the right of v's parent.
题意:有一颗树,给出叶子节点有哪些,叶子节点之间互相的距离,每个节点的深度,并且每层给定左右顺序,树边不交叉,要求复原树。
其实就是一个模拟题,我们可以知道,如果同一层两个叶子节点的距离是2,那么他们肯定是兄弟节点,而由于左右顺序给定,叶节点也给定,那么某一层最左边的两个叶子节点的父节点一定是上一层最左边的一个非叶子节点,而父节点和除子树外各节点的距离,其实是子节点和它们距离 - 1。我就能通过子节点得到父节点的距离信息了。
这个思路就可以做模拟了,我们对于最后一层从最左边的叶子节点开始,找到所有它的兄弟,它的距离顺便更新它的父节点的距离,之后父节点就可以当做叶节点了,然后继续操作同层所有的叶节点,寻找到父亲并更新父亲的距离。这样一层一层向上知道第二层就行。
模拟裸题。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std; const int maxn=;
const int INF=0x3f3f3f3f;
const int mod=1e9+; int n,m,k; int vis[maxn];
int fa[maxn];
int mcnt[maxn];
int M[maxn][maxn];
int Map[maxn][maxn];
int a[maxn]; void update( int l ){
int f = fa[l];
for(int i = ; i <= n ; ++ i ){
if( Map[l][i] != -){
Map[f][i] = Map[i][f] = Map[l][i] - ;
}
}
} int main(){
memset(fa,-,sizeof(fa));
scanf("%d%d%d",&n,&m,&k);
for(int i = ; i <= m ; ++ i){
scanf("%d",&mcnt[i]);
}
for(int i = ; i <= m ; ++ i){
for(int j = ; j <= mcnt[i] ; ++ j){
scanf("%d",&M[i][j]);
}
}
memset(vis,,sizeof(vis));
for(int i = ; i <= k ; ++ i){
scanf("%d",&a[i]);
vis[a[i]] = ;
}
memset(Map,-,sizeof(Map));
for(int i = ; i <= k ; ++ i ){
for(int j = ; j <= k ; ++ j ){
scanf("%d",&Map[a[i]][a[j]]);
}
} for(int l = m ; l > ; -- l ){
int S = l,F = l - ;
int pos1 = ,pos2 = ;
while( pos2 <= mcnt[F] && vis[ M[F][pos2] ] )pos2++;
fa[ M[S][pos1] ] = M[F][pos2];
while( pos1 <= mcnt[S] ){
int l1 = M[S][pos1];
if(pos1 == mcnt[S] ){
update( l1 );
break;
}
else{
int l2 = M[S][pos1+];
if( Map[l1][l2] != ){
update( l1 );
pos2++;
while( pos2 <= mcnt[F] && vis[ M[F][pos2] ] )pos2++;
}
fa[l2] = M[F][pos2];
pos1++;
}
}
}
for(int i = ; i <= n ; ++ i ){
if(fa[i] == - )printf("");
else printf("%d",fa[i]);
if(i==n)printf("\n");
else printf(" ");
}
return ;
}
hihocoder1490 Tree Restoration 模拟的更多相关文章
- Codeforces Round #353 (Div. 2) D. Tree Construction 模拟
D. Tree Construction 题目连接: http://www.codeforces.com/contest/675/problem/D Description During the pr ...
- Tree Restoration Gym - 101755F (并查集)
There is a tree of n vertices. For each vertex a list of all its successors is known (not only direc ...
- #1490 : Tree Restoration
微软 2017春招真题 题目 There is a tree of N nodes which are numbered from 1 to N. Unfortunately, its edges a ...
- POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28399 Accepted: 9684 De ...
- 【微软2017年预科生计划在线编程笔试 B】Tree Restoration
[题目链接]:https://hihocoder.com/problemset/problem/1490 [题意] 给你一棵树的以下信息: 1.节点个数 2.给出树的每一层从左到右的顺序每个节点的编号 ...
- HDU 4925 Apple Tree(模拟题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 解题报告:给你n*m的土地,现在对每一块土地有两种操作,最多只能在每块土地上进行两种操作,第一种 ...
- hihocoder 1490 Tree Restoration
构造. 从最后一层开始往上构造.最后一层肯定都是叶子结点,距离为2的肯定是同一个父亲,确定好了父亲之后,可以确定上一层每个节点之间的距离,以及上一层每个节点到还未确定的叶子节点之间的距离. #incl ...
- Codeforces gym101755F Tree Restoration(拓扑排序)
题意: 一棵树,给出每个点的后代们,问你这棵树是否存在,存在就给出这棵树 n<=1000 思路: 对祖先->后代建立有向图,跑拓扑排序.跑的时候不断更新父亲并判断答案的存在性,同时注意一种 ...
- 【EasyUI学习-2】Easyui Tree的异步加载
作者:ssslinppp 1. 摘要 2. tree的相关介绍 3. 异步加载tree数据,并实现tree的折叠展开 3.1 功能说明: 3.2 前台代码 3.3 后台代码 4. 其他 1 ...
随机推荐
- C++解析六-继承
面向对象程序设计中最重要的一个概念是继承.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行时间的效果.当创建一个类时,您不需要重新编 ...
- img2html实现将图片转换成网页
简单介绍img2html的用法,安装就不用说了pip.这个包现只支持python2,支持python的话需改下源码这几个部分: 加注释的是修改的地方 #!/usr/bin/env python # e ...
- ubuntu查看占用某端口的程序
查看端口使用情况,使用netstat命令. 查看已经连接的服务端口(ESTABLISHED netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap 查 ...
- linux 创建安装redis服务
1.找下redis的官方的下载地址:http://download.redis.io/releases/redis-3.2.8.tar.gz 有最新的就下载最新 先下载解压跟安装 wget http ...
- 使用scrapy爬取dota2贴吧数据并进行分析
一直好奇贴吧里的小伙伴们在过去的时间里说的最多的词是什么,那我们就来抓取分析一下贴吧发文的标题内容,并提取分析一下,看看吧友们在说些什么. 首先我们使用scrapy对所有贴吧文章的标题进行抓取 scr ...
- php字符编码转换之gb2312转为utf8(转)
在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...
- Ubuntu Core 网络配置
/********************************************************************************* * Ubuntu Core 网络配 ...
- Groovy实现代码热载的机制和原理
前言: 真的很久没在博客园上更新博客了, 现在趁这段空闲的时间, 对之前接触的一些工程知识做下总结. 先来讲下借用Groovy如何来实现代码的热载, 以及其中涉及到的原理和需要注意的点. 总的来说, ...
- mxnet自定义dataloader加载自己的数据
实际上关于pytorch加载自己的数据之前有写过一篇博客,但是最近接触了mxnet,发现关于这方面的教程很少 如果要加载自己定义的数据的话,看mxnet关于mnist基本上能够推测12 看pytorc ...
- Mysql 创建数据库命令
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...