ZOJ Problem Set - 1097
Code the Tree

Time Limit: 2 Seconds      Memory Limit: 65536 KB

A tree (i.e. a connected graph without cycles) with vertices numbered by the integers 1, 2, ..., n is given. The "Prufer" code of such a tree is built as follows: the leaf (a vertex that is incident to only one edge) with the minimal number is taken. This leaf, together with its incident edge is removed from the graph, while the number of the vertex that was adjacent to the leaf is written down. In the obtained graph, this procedure is repeated, until there is only one vertex left (which, by the way, always has number n). The written down sequence of n-1 numbers is called the Prufer code of the tree. 
Your task is, given a tree, to compute its Prufer code. The tree is denoted by a word of the language specified by the following grammar:

T ::= "(" N S ")"
S ::= " " T S
| empty
N ::= number

That is, trees have parentheses around them, and a number denoting the identifier of the root vertex, followed by arbitrarily many (maybe none) subtrees separated by a single space character. As an example, take a look at the tree in the figure below which is denoted in the first line of the sample input.

Note that, according to the definition given above, the root of a tree may be a leaf as well. It is only for the ease of denotation that we designate some vertex to be the root. Usually, what we are dealing here with is called an "unrooted tree".

Input Specification

The input contains several test cases. Each test case specifies a tree as described above on one line of the input file. Input is terminated by EOF. You may assume that 1<=n<=50.

Output Specification

For each test case generate a single line containing the Prufer code of the specified tree. Separate numbers by a single space. Do not print any spaces at the end of the line.

用连接表存储树,再每次找最小的leaf即可。难点是建树。方法:

1.建一个栈用于存储节点。

2.当遇到 ( 时,输入节点编号i,(1)如果栈非空,栈顶与 i 相邻,更新邻接表中栈顶和i的相应项,再将i压入栈中;(2)如果栈为空,将i压入栈中。

3.当遇到 ) 时,弹栈。

4. 当遇到空格时,跳过。

注意当树只有根时,如(1),输出换行符即可

AC code:

 #include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <list>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std; const int MAXN = ; int maxId, cntId; //maxId是最大节点,cntId是节点数
list<int> adj[MAXN]; //邻接表 void build_tree()
{
char c;
int id;
stack<int> sta;
scanf("%d", &id);
sta.push(id);
cntId = ;
maxId = id;
while(scanf("%c", &c) && c != '\n')
{
if(c == ' ') continue;
if(c == '(')
{
scanf("%d", &id);
cntId++;
if(maxId < id) maxId = id;
int f = sta.top();
adj[f].push_front(id);
adj[id].push_front(f);
sta.push(id);
}
else if(c == ')') sta.pop();
}
} int findMinLeaf()
{
int i;
for(i = ; i <= maxId; i++)
{
if(adj[i].size() == ) break;
}
int s = *adj[i].begin();
adj[i].pop_back();
list<int>::iterator it = adj[s].begin();
for(; it != adj[s].end(); it++)
{
if(*it == i) break;
}
adj[s].erase(it);
return s;
} int main()
{
char ch;
while(scanf("%c", &ch) != EOF)
{
int i;
for(i = ; i < MAXN; i++)
adj[i].clear();
build_tree();
if(cntId < )
{
puts("");
continue;
}
for(i = ; i < cntId - ; i++)
printf("%d ", findMinLeaf());
printf("%d\n", findMinLeaf());
}
return ;
}

2013-07-31 23:09:35

Code the Tree(图论,树)的更多相关文章

  1. POJ Code the Tree 树的pufer编号

    Code the Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2259   Accepted: 859 Desc ...

  2. 第七届河南省赛G.Code the Tree(拓扑排序+模拟)

    G.Code the Tree Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 18 [Submit][Status][Web ...

  3. Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  4. poj 2567 Code the Tree 河南第七届省赛

    Code the Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2350   Accepted: 906 Desc ...

  5. 页面设计--Tree目录树

    Tree目录树控件属性: 根据数据集合来配置相应的信息 加载模式有自动加载.自定加载 web中显示效果图:

  6. Code the Tree

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2292   Accepted: 878 Description A tree ...

  7. [转] Splay Tree(伸展树)

    好久没写过了,比赛的时候就调了一个小时,差点悲剧,重新复习一下,觉得这个写的很不错.转自:here Splay Tree(伸展树) 二叉查找树(Binary Search Tree)能够支持多种动态集 ...

  8. CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划)

    CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划) Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的 ...

  9. 【数据结构】B-Tree, B+Tree, B*树介绍 转

    [数据结构]B-Tree, B+Tree, B*树介绍 [摘要] 最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tre ...

随机推荐

  1. JS练习题2共8题

    <p>1 打印出1-100里所有的偶数</p> <script> // for(var i=1;i<=100;i++){ // if(i%2==0){ // ...

  2. 共享jQuery/Eclipse/SVN/PS/DW/的API文档

    1:jQuery的API和jquery.js和jquery.min.js 链接:http://pan.baidu.com/s/1gf7GD83 密码:tbt1 2:虚拟机软件和frdora和ubunt ...

  3. 代码大全 MSIL语言程序设计

    .NET平台的编译器会将高级语言(C#,VB.NET,F#)编译成MSIL(微软中间语言)格式.熟悉MSIL语言,可以读懂一些加密程序混淆过的算法,这些算法几乎不能还原成高级语言,但是可以还原成MSI ...

  4. [原创]配置管理技术圈QQ群:129489184

    [原创]配置管理技术圈QQ群:129489184 配置管理技术圈QQ群:129489184,研究cvs,svn,git,cc等平台配置技术,涉及版本控制,持续集成,自动化构建等! 欢迎各位同学来,来时 ...

  5. 小白学数据分析----->付费用户生命周期研究

    付费用户其实存在一个付费周期转化的问题,直接指标可能就是付费渗透率的问题,然而在此背后其实还有更深入的问题.我们经常遇到的是推广渠道获得的新用户,且这批用户进入游戏的状态.其实在付费用户问题研究方面, ...

  6. Less/Sass编译工具,koala使用指南

    如果你正在使用sass.less或coffee,而没有注意到koala, 那说明你可能已经好久没有更新你的知识库了.koala这个由国人编写的,用于编译sass.less.coffee利器,在最近的短 ...

  7. 【Android开发坑系列】之事件

    总结一下: 1.Touch事件分发中只有两个主角:ViewGroup和View.ViewGroup包含onInterceptTouchEvent.dispatchTouchEvent.onTouchE ...

  8. 【转】JAVA 接口

    1.定义接口    使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] inter ...

  9. 启动和JQuery绑定--AngularJS学习笔记(二)

    上一篇简单的分析了AngularJS的项目结构,后面就开始分析具体的源代码了. 从angularFiles.js中的定义可以看出有几个文件直接位于src根目录,并不是隶属于某个模块.这几 个分别是mi ...

  10. centos7 Linux 安装mysql

    安装过程如: http://blog.csdn.net/tengdazhang770960436/article/details/18361979 中间过程出现无法安装mysql-server 解决方 ...