POJ 2568/ZOJ 1965 Decode the Tree
题意:在树中,每次删去节点值最小的叶子结点。
每删去一个点,就给出与这相连的点的值,直到最后只剩下一个根结点,给这N-1个数,重新建立这个树。
思路:
给出的节点号按次序存入到数组a中,将未给出的数存入到rest数组中去,并从小到大排序。
每次取一个给出的节点,那么我们需要求出与该点相连的被删去的点v。
而点v必定为 “不会在之后的数据中出现的值(即之后删除的叶子节点中再也没有与之相连的,即改点为叶子节点)” 和 “当前rest数组中最小的值” 中的最小值。
那么只要预处理一下,对于给出的节点号u,num[u][i]表示在给出的n-1个节点号(标号为0~n-2)中,第i个以后(包括第i个)有几个u。
这样对于第i个节点号,u=a[i],求与它相连的v的时候,只要遍历一下所有num[u][i]=0并且之前还没被用过的情况,选取其中最小的值,与当前的rest数组中最小的值比较,最小的那个即使v。
将n-1对(u,v)存入到另一个数组,最后建树即可。
不知道怎么回事,一开始用puts(),getline(),结果都是Output Limit Exceeded,可能自己使用有些错误吧。
后来看了网上别人用sstream类库读取数据的方法,这才AC。。。
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- #include <string>
- #include <vector>
- #include <sstream>
- using namespace std;
- const int maxn=;
- int a[maxn];
- int num[maxn][maxn]; //num[u][i]表示在a[i]以后(包括a[i])有几个a[i]。
- int vis[maxn]; //vis[i]=1表示i在给出的数据中,=0即剩下的点
- int rest[maxn]; //存储给出的数据中未出现的点的编号
- int used[maxn]; //标记哪些点已经用过了
- vector<int>son[maxn];
- struct Node{
- int u,v; //u是给出的数据中的节点,v是与它们相连的被删去的节点
- }node[maxn];
- void dfs(int u){
- printf("(");
- printf("%d",u);
- for(int i=;i<son[u].size();i++){
- printf(" "); //不打空格,也AC
- dfs(son[u][i]);
- }
- printf(")");
- }
- int main()
- {
- string buf;
- char ch,str[];
- int idx,u,v,minv;
- while(getline(cin,buf)){
- for(int i=;i<maxn;i++)
- son[i].clear();
- memset(vis,,sizeof(vis));
- memset(num,,sizeof(num));
- memset(used,,sizeof(used));
- stringstream ss(buf);
- for(idx=;ss>>a[idx];idx++);
- //预处理num[][]。
- for(int i=idx-;i>=;i--){
- vis[a[i]]=; //标记出现过的节点号
- num[a[i]][i]=num[a[i]][i+]+;
- for(int j=;j<idx;j++){
- if(a[j]!=a[i])
- num[a[j]][i]=num[a[j]][i+];
- }
- }
- int rlen=,r=; //rlen为rest数组的长度,r是指针,指向当前最小的值
- for(int i=;i<=a[idx-];i++){
- if(!vis[i]){
- rest[rlen++]=i;
- }
- }
- sort(rest,rest+rlen);
- int k=;
- for(int i=;i<idx;i++){
- u=a[i];
- minv=;
- //选取num[a[j]]=0和rest[r]中的最小值,即为与u相连的被删去的节点。
- //注意a[j]是未被使用过的,used[a[j]]=1表明a[j]在之前就被删去了,也就不可能在这次删去节点a[j]
- for(int j=;j<idx;j++){
- if(num[a[j]][i]== && a[j]<minv && !used[a[j]]){
- minv=a[j];
- }
- }
- if(r<rlen && rest[r]<minv){
- minv=rest[r];
- r++;
- }
- used[minv]=;
- node[k].u=u;
- node[k].v=minv;
- k++;
- }
- //建树
- for(int i=;i<k;i++){
- u=node[i].u;
- v=node[i].v;
- son[u].push_back(v);
- }
- //即如果读入的一行是空的,那么就只有1个节点1
- if(a[idx-]==)
- a[idx-]=;
- dfs(a[idx-]);
- printf("\n");
- }
- return ;
- }
POJ 2568/ZOJ 1965 Decode the Tree的更多相关文章
- POJ 3076 / ZOJ 3122 Sudoku(DLX)
Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...
- POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)
题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...
- 三分 POJ 2420 A Star not a Tree?
题目传送门 /* 题意:求费马点 三分:对x轴和y轴求极值,使到每个点的距离和最小 */ #include <cstdio> #include <algorithm> #inc ...
- poj 3100 (zoj 2818)||ZOJ 2829 ||ZOJ 1938 (poj 2249)
水题三题: 1.给你B和N,求个整数A使得A^n最接近B 2. 输出第N个能被3或者5整除的数 3.给你整数n和k,让你求组合数c(n,k) 1.poj 3100 (zoj 2818) Root of ...
- POJ 2567 Code the Tree & POJ 2568 Decode the Tree Prufer序列
题目大意:2567是给出一棵树,让你求出它的Prufer序列.2568时给出一个Prufer序列,求出这个树. 思路:首先要知道Prufer序列.对于随意一个无根树,每次去掉一个编号最小的叶子节点,并 ...
- poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)
ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- [POJ 2420] A Star not a Tree?
A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4058 Accepted: 200 ...
- poj 1080 zoj 1027(最长公共子序列变种)
http://poj.org/problem?id=1080 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=27 /* zoj ...
随机推荐
- Linux多线程编程(不限Linux)
前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...
- OpenGL第6、7讲小结
因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...
- Java通过代理类实现数据库DAO操作
下面的所有代码示例都取自李兴华的<Java Web开发实战经典>的随书源码,因为觉得设计得很好,所以将代码摘录下来作成笔记. 首先,我们在一个java文件中定义要存储的结构类型: impo ...
- 【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转
//绕着与axis平行的任意轴旋转 void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 ...
- 关于MD5加密的小知识
- (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, ...
- javascript 逻辑运算符
javascript逻辑运算符 NOT(!) AND(&&) OR(||) NOT(!) 返回值的类型一定是Boolean值的 运算数也是Boolean值 返回值是:与相反的boole ...
- oracle 文件导出
$ cat me.sqlset echo offset term offset line 1000 pages 0set feedback offset heading offset trimspoo ...
- impdp ORA-29913: error in executing ODCIEXTTABLEOPEN callout
1.数据导出时的日志 ;;; Export: Release :: Copyright (c) , , Oracle and/or its affiliates. All rights reserve ...
- python 字典内置方法get应用
python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...
- Teradata中fastload使用
Teradata Fastload Utility 是teradata数据库中一个基于命令行的快速load大量数据到一个空表的工具. 数据可以从以下途径被load: 1) Disk 或 tape; 2 ...