POJ 2567 Code the Tree & POJ 2568 Decode the Tree Prufer序列
题目大意:2567是给出一棵树,让你求出它的Prufer序列。2568时给出一个Prufer序列,求出这个树。
思路:首先要知道Prufer序列。对于随意一个无根树,每次去掉一个编号最小的叶子节点,并保存这个节点所连接的节点所得到的序列就是这棵树的Prufer序列。
这个序列有十分优雅的性质。它能与无根树一一相应。因此。两个标号一样的无根树得到的Prufer序列也一定是一样的。
此外,设一个节点的度数是d[i],那么他会在Prufer序列中出现d[i] - 1次。
2567:记录每个节点的度。依照Prufer序列的定义。最后输出队列中剩余的元素。
2568:由Prufer序列可以求出每一个点的度。把度数为1的点增加到队列中去。每次找一个队列中编号最小的。与当前Prufer序列中的数字连一条边,然后降低对应的度数。
CODE(2567):
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 110
using namespace std; priority_queue<int,vector<int>,greater<int> > q; int points;
int degree[MAX];
int head[MAX],total;
int next[MAX << 1],aim[MAX << 1]; int stack[MAX],top;
bool v[MAX]; inline void Initialize()
{
points = total = top = 0;
memset(degree,0,sizeof(degree));
memset(v,false,sizeof(v));
memset(head,0,sizeof(head));
} inline void Add(int x,int y)
{
next[++total] = head[x];
aim[total] = y;
head[x] = total;
} inline char GetChar()
{
char c;
do c = getchar(); while(c == ' ' || c == '\n' || c == '\r');
return c;
} inline void TopSort()
{
for(int i = 1; i <= points; ++i)
if(degree[i] == 1)
q.push(i),v[i] = true;
for(int i = 1; i <= points - 2; ++i) {
int x = q.top(); q.pop();
for(int j = head[x]; j; j = next[j]) {
if(v[aim[j]]) continue;
--degree[aim[j]];
printf("%d ",aim[j]);
if(degree[aim[j]] == 1) {
v[aim[j]] = true;
q.push(aim[j]);
}
}
}
q.pop();
printf("%d\n",q.top());
q.pop();
} int main()
{
char c;
while(GetChar() != EOF) {
Initialize();
scanf("%d",&stack[++top]);
points = stack[top];
while(top) {
c = GetChar();
if(c == '(') {
int temp;
scanf("%d",&temp);
points = max(points,temp);
Add(stack[top],temp);
Add(temp,stack[top]);
++degree[stack[top]];
++degree[temp];
stack[++top] = temp;
}
else top--;
}
if(points == 1) {
puts("");
continue;
}
TopSort();
}
return 0;
}
CODE(2568):
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 1010
using namespace std; char s[MAX];
int src[MAX],cnt;
int degree[MAX];
int head[MAX],total;
int next[MAX],aim[MAX];
int points; inline void Initialize()
{
total = cnt = points = 0;
memset(degree,0,sizeof(degree));
memset(head,0,sizeof(head));
} inline void Add(int x,int y)
{
next[++total] = head[x];
aim[total] = y;
head[x] = total;
} inline void Decode()
{
static priority_queue<int,vector<int>,greater<int> > q;
while(!q.empty()) q.pop();
for(int i = 1; i <= points; ++i)
if(!degree[i]) q.push(i);
for(int i = 1; i <= cnt; ++i) {
int x = src[i];
int y = q.top(); q.pop();
Add(x,y); Add(y,x);
if(!--degree[x]) q.push(x);
}
//int x = q.top(); q.pop();
//int y = q.top(); q.pop();
//Add(x,y),Add(y,x);
} inline void OutPut(int x,int last)
{
if(x != 1) putchar(' ');
putchar('(');
printf("%d",x);
for(int i = head[x]; i; i = next[i]) {
if(aim[i] == last) continue;
OutPut(aim[i],x);
}
putchar(')');
} int main()
{
while(gets(s) != NULL) {
Initialize();
char *p = s;
while(*p != '\0') {
sscanf(p,"%d",&src[++cnt]);
points = max(points,src[cnt]);
++p,++p;
if(src[cnt] > 9) ++p;
}
memset(s,'\0',sizeof(s));
for(int i = 1; i <= cnt; ++i)
++degree[src[i]];
Decode();
OutPut(1,0);
puts("");
}
return 0;
}
POJ 2567 Code the Tree & POJ 2568 Decode the Tree Prufer序列的更多相关文章
- poj 2567 Code the Tree 河南第七届省赛
Code the Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2350 Accepted: 906 Desc ...
- Tree Recovery POJ - 2255
Tree Recovery POJ - 2255 根据树的前序遍历和中序遍历还原后序遍历. (偷懒用了stl的find) #include<iostream> #include<st ...
- ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...
- [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- 33. Minimum Depth of Binary Tree && Balanced Binary Tree && Maximum Depth of Binary Tree
Minimum Depth of Binary Tree OJ: https://oj.leetcode.com/problems/minimum-depth-of-binary-tree/ Give ...
- [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
[leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree 链接 leetcode 描述 ...
- POJ 2568/ZOJ 1965 Decode the Tree
题意:在树中,每次删去节点值最小的叶子结点. 每删去一个点,就给出与这相连的点的值,直到最后只剩下一个根结点,给这N-1个数,重新建立这个树. 思路: 给出的节点号按次序存入到数组a中,将未给出的数存 ...
- [欧拉回路+手动开栈] poj 1780 Code
题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
随机推荐
- 一个事件激活多个JavaScript函数
http://www.cnblogs.com/meil/archive/2006/09/20/509359.html如果你的网页中一个“OnLoad”事件要激活两个以上的JavaScript函数,那怎 ...
- mosquitto ---配置SSL/TLS
在服务器电脑上面创建myCA文件夹, 如在/home/qa/ 文件夹下使用命令, mkdir myCA 然后执行以下命令,我们将创建并使用其他用户没有权限访问的目录. sudo chmod 700cd ...
- Linux下connect超时处理
1.前言 最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口.当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口.我们知道端口属于网络的传输层, ...
- GuozhongCrawler系列教程 (4) StartContext具体解释
StartContext是注入时全部seed的上下文信息假设爬虫在抓取过程其中须要共享一些变量.那么可使用StartContext作为容器. 构造器具体资料 StartContext public S ...
- spring概念简介、bean扫描与注册实现方式
写在前面:本文作为整理,包含很多个人理解,有跳跃成份,初学者如果看晕了,可以先看其它同类文章,或者……多看几遍. 一.概念部分: 1.spring概念:网上有很多 2.spring核心:IOC(DI) ...
- location 设定某个文件的过期时间,并不记录访问日志
网页的根目录本来是: 6 root /app/www/default; [root@web01 default]# cat /app/server/nginx/conf/vhosts/default. ...
- php chr() ord()中文截取乱码问题解决方法
今天看到chr() ord()中文截取乱码问题这个例子,觉得相当的不错,拿出来和大家分享下,有兴趣的朋友可以去试下,看看怎么样. 代码如下: <?php $lenth = ; $str = &q ...
- iOS-获取苹果商店iPhone应用程序编号APPID-应用中跳转到AppStore中的其他应用
iOS-获取苹果商店iPhone应用程序编号APPID-应用中跳转到AppStore中的其他应用 一 获取苹果商店iPhone应用程序编号APPID 1 在mac上打开itunes 选择中的A 然后 ...
- 使用JSON Web Tokens和Spring实现微服务
http://www.jdon.com/dl/best/json-web-tokens-spring-cloud-microservices.html
- location.href 不响应的解决方法
在某些时候修改元素的值的时候过快会导致失效 1.window.open("","_blank") 代替 不过也是打开新窗口 2.延迟调用location.hr ...