POJ 2003 Hire and Fire (Tree)

  题目: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 = 1; i <= dep; ++i)
        cout<<"+";
    cout<<now->name<<endl;;
    //递归打印每个孩子结点
    for(list<Tman *>::iterator j = now->sons.begin(); j != now->sons.end(); ++j)
        print(dep + 1, *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() > 0)//如果要删的结点有孩子
    {
        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(0,root);
            cout<<"------------------------------------------------------------"<<endl;
        }
        else if(str1 == "fire")
        {
            cin>>str2;
            fire(str2);
        }
        else
        {
            cin>>str2;
            cin>>str2;
            hires(str1, str2);
        }
    }
}

int main()
{
    solve();
    return 0;
}
时间: 2024-09-30 18:35:40

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

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

Hire and Fire Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2316   Accepted: 655 Description In this problem, you are asked to keep track of the hierarchical structure of an organization's changing staff. As the first event in the life

HDU 1325 POJ 1308 Is It A Tree? (并查集)

这道题就是裸并查集,关键在于对不是树几种的判断 1. 空树是树 2. 森林不是树 3. 无环 或者从入度来看:1,无环:2,除了根,所有的入度为1,根入度为0:3,这个结构只有一个根,不然是森林了. 这道题本来暑假做的POJ 1308 但是HDU没有过.在于空树没有考虑. 用并查集判断有多少个森林注意编号是随机的,不是次序.... /* input: 0 0 1 1 0 0 1 2 1 2 0 0 1 2 2 3 4 5 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9

【POJ】【1741】Tree

点分治 怎么又一道叫Tree的题目……真是醉了. 本题为漆子超论文<分治算法在树的路径问题中的应用>例一 题解 : http://blog.csdn.net/sdj222555/article/details/7893862      http://blog.csdn.net/yang_7_46/article/details/9966455 既然是点分治嘛,为了保证复杂度不退化,必然要找树的重心,这一步可以通过一次dfs实现:以任意节点为根(方便起见就选1号节点了)求出每个 节点子树大小,那

HDU 1325,POJ 1308 Is It A Tree

HDU认为1>2,3>2不是树,POJ认为是,而Virtual Judge上引用的是POJ数据这就是唯一的区别....(因为这个瞎折腾了半天) 此题因为是为了熟悉并查集而刷,其实想了下其实好好利用sort应该能更简单A掉,下次有空再去试试... 题目大意:判断是否为树,so: 1,无环: 2,除了根,所有的入度为1,根入度为0: 3,这个结构只有一个根,不然是森林了:4.空树也是树,即第一次输入的两个数字为0 0则是树,其他时候输入只是结束条件 因为POJ和HDU题面一样,要求不一样,所以这题

POJ 1308 Is It A Tree? &amp;&amp; NYOJ 129 (树的判定+并查集)

[题目链接]click here~~ [题目大意]给定多对节点,判断所有节点能否组成一棵树 [解题思路]并查集的基本操作,定义node,edge,统计node和edge的数目,如果(edge==node-1||node==0)则可以成树 树的判定:n个节点,最多n-1条环,只有一个入度为边,不成0 的点,其他入度不大于1,不过要注意poj数据里如果1 1 0 0也会不符合要求,也就是不能自己指向自己 代码: /* Author:HRW 树的判定: n个节点,最多n-1条边 不成环 只有一个入度为

POJ 1308 Is It A Tree?

Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24299   Accepted: 8339 Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edge

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

Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31092   Accepted: 10549 Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edg

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

Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23006   Accepted: 7898 Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edge

[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 set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the root, t