题目:Hire and Fire

  题目翻译成数据结构就是:建树,加结点,删除结点,打印结点。只有删除结点稍微复杂点,因为删除设计掉树的调整。

  首先要考虑树怎么存储才能使解题更顺手。

  1.我们要存储每个结点的孩子,父亲和名字。存储孩子是因为第一个孩子可能会“升级”,存储父亲是因为要打印,名字肯定也是要打印的;

  2.我们要知道每个结点的子树,删除结点会涉及调整;

  3.我们要知道根节点,存放CEO。

  所以我们的结点出来了,如下:

 struct Tman
{
string name;
Tman *father;
list<Tman *> sons;
};

 思路都在注释里。

  代码如下:

#include<iostream>
#include<map>
#include<list>
#include<string>
using namespace std; //存储名字,父亲,孩子就行
struct Tman
{
string name;
Tman *father;
list<Tman *> sons;
};
//key是结点名字,value是名字的子树
map<string, Tman *> hash; //根结点,指向CEO,打印是要用
Tman *root; void print(long dep, Tman *now)
{
if(now == NULL) return;
for(long i = ; i <= dep; ++i)
cout<<"+";
cout<<now->name<<endl;;
//递归打印每个孩子结点
for(list<Tman *>::iterator j = now->sons.begin(); j != now->sons.end(); ++j)
print(dep + , *j);
} void hires(string n1, string n2)
{
Tman *boss = hash[n1];//父亲的子树指针
Tman *employee = new Tman();//新建一个Tman结构体,用于存储新加入的结点
employee->name = n2;//新加入结点的名字
employee->father = boss;//n1是n2的父亲
boss->sons.push_back(employee);//把n2放入n1的孩子list中
hash[n2] = employee;//新加入的结点也要有子树
} void fire(string n1)
{
Tman *p = hash[n1];//指向n1结点的指针
hash.erase(n1);
while(p->sons.size() > )//如果要删的结点有孩子
{
p->name = p->sons.front()->name;//第一个孩子取代父亲的地位
hash[p->name] = p;//父亲的子树交给第一个孩子
p = p->sons.front();//p往下移动,始终指向孩子队列的第一个
}
p->father->sons.remove(p);//最后一个没有孩子的结点“删除”,实际上是上移了
delete p;//防止野指针
} void solve()
{
string str1,str2;
long i;
cin>>str1;
root = new Tman();
hash[str1] = root;
root->name = str1;
while(cin>>str1)
{
if(str1 == "print")
{
print(,root);
cout<<"------------------------------------------------------------"<<endl;
}
else if(str1 == "fire")
{
cin>>str2;
fire(str2);
}
else
{
cin>>str2;
cin>>str2;
hires(str1, str2);
}
}
} int main()
{
solve();
return ;
}

POJ 2003 Hire and Fire (Tree)的更多相关文章

  1. POJ 2003 Hire and Fire (多重链表 树结构 好题)

    Hire and Fire Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2316   Accepted: 655 Desc ...

  2. HDU 1325,POJ 1308 Is It A Tree

    HDU认为1>2,3>2不是树,POJ认为是,而Virtual Judge上引用的是POJ数据这就是唯一的区别....(因为这个瞎折腾了半天) 此题因为是为了熟悉并查集而刷,其实想了下其实 ...

  3. hdu 1325 && poj 1308 Is It A Tree?(并查集)

    Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a ...

  4. POJ 1308 Is It A Tree?和HDU 1272 小希的迷宫

    POJ题目网址:http://poj.org/problem?id=1308 HDU题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1272 并查集的运用 ...

  5. POJ 1308 Is It A Tree?

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18778   Accepted: 6395 De ...

  6. HDU ACM 1325 / POJ 1308 Is It A Tree?

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. POJ 1308 Is It A Tree? (并查集)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24237   Accepted: 8311 De ...

  8. POJ 1308 Is It A Tree? (并查集)

    Is It A Tree? 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/M Description A tree is a w ...

  9. POJ 1308 Is It A Tree?--题解报告

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31092   Accepted: 10549 D ...

随机推荐

  1. Android开发之多媒体编程之获取图片的副本

    使用BitmapFactory的decodeFile()方法获取的Bitmap对象是只读的,无法进行编辑操作 需要进行编辑的话,需要获取到该对象的一个副本 代码如下: import android.a ...

  2. 1701. Ostap and Partners(并查集-关系)

    1701 又是类似食物链的这一类题 这题是找与根节点的和差关系 因为0节点是已知的 为0  那么所有的都可以转换为与0的和差关系 可以规定合并的两节点 由大的指向小的 然后再更新和差关系 有可能最后有 ...

  3. poj 1442 Black Box(堆 优先队列)

    题目:http://poj.org/problem?id=1442 题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的 刚开始用了一个小顶堆,超时,后来看了看别人 ...

  4. [POJ 3420] Quad Tiling

      Quad Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3495   Accepted: 1539 Des ...

  5. Idea无法DEBUG的问题

    最近对web工程进行debug,突然发现无法进入断点了,原来以为是maven的问题,后来发现是tomcat环境变量导致的. 使用tomcat时经常碰到内存不足的情况,我们会对catalina.bat类 ...

  6. apache开源项目--PDFBox

    PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建.处理以及文档内容提取功能,也包含了一些命令行实用工具. 主要特性包括: 从PDF提取文本 合并PDF文档 PDF 文档加密与解密 ...

  7. hdu 2639 Bone Collector II

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 【转】禁止seekbar的拖动事件

    原文网址:http://blog.csdn.net/ansionnal/article/details/8229801 当然是可以的! 其实是 onTouchEvent 事件时,不让他传递事件就行了! ...

  9. JavaEE基本了解

    1.  为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程 ...

  10. web框架之Spring-MVC环境搭建

    spring框架配置 1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ...