zoukankan      html  css  js  c++  java
  • POJ 2021 Relative Relatives(map+树的遍历)

    题意:
      今天是Ted的100岁生日。凑巧的是,他家族里面每个人都跟他同一天生日,但是年份不同。
      现在只给出一些 父亲的名字,孩子的名字,以及孩子出生时父亲的年龄,
      要求将Ted以外的家族成员按年龄降序排序,如果年龄相同,则按字母排序。

    思路:遍历树。
      根据题意,可通过父子关系建立一个有权无向树,Ted作为树的根节点。通过从Ted所在节点开始遍历树,给每个节点赋值。
      最后根据每个成员的年龄排序即可。
      这里用到map,建立名字到编号的映射,从而获取一个人在树中的节点编号。

    #include <iostream>
    #include <stdio.h>
    #include <map>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    map<string,int> person;
    int n;  //即题目中的X值
    
    struct Line{
        string fname;  //父亲的名字
        string cname;  //孩子的名字  
        int fage;  //孩子出生时,父亲的年龄
    }line[105];
    struct Node{
        string name;  //名字
        int age;  //年龄
        int fage;  //出生时父亲的年龄,则该节点的年龄=父亲的年龄-fage
        vector<int> son;  //存储孩子的编号
        bool operator<(const Node tmp)const{
            if(age==tmp.age)
                return name<tmp.name;
            else
                return age>tmp.age;
        }
    }node[105];
    
    //遍历,求节点的年龄
    void dfs(int u){
        for(int i=0;i<node[u].son.size();i++){
            int v=node[u].son[i];
            node[v].age=node[u].age-node[v].fage;
            dfs(v);
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int q=1;q<=t;q++){
            printf("DATASET %d
    ",q);
            person.clear();
            for(int i=1;i<105;i++)
                node[i].son.clear();
    
            int idx=0;
            person["Ted"]=++idx;
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                cin>>line[i].fname>>line[i].cname>>line[i].fage;
                //如果不存在该字符串的映射,即映射为0,则建立映射关系
                if(!person[line[i].fname])
                    person[line[i].fname]=++idx;
                if(!person[line[i].cname]){
                    person[line[i].cname]=++idx;
                }
            }
            //根节点
            node[1].name="Ted";
            node[1].age=100;
            int u,v;
            for(int i=1;i<=n;i++){
                u=person[line[i].fname];
                v=person[line[i].cname];
                node[u].name=line[i].fname;
                node[u].son.push_back(v);
                node[v].name=line[i].cname;
                node[v].fage=line[i].fage;
            }
    
            dfs(1);
            sort(node+1,node+idx+1);
            for(int i=1;i<=idx;i++){
                if(node[i].name!="Ted")
                    cout<<node[i].name<<" "<<node[i].age<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    leetcode 第 48 场双周赛
    线段树总结篇
    nodemon 自动重启nodejs服务
    腾讯云 openssl 升级
    windows下批量杀死进程
    ./bin/mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
    python 获取过去几天,过去几个月,过去几年的时间列表
    Mysql解决The total number of locks exceeds the lock table size错误
    win 10 如何找到 mysql 的 my.ini 文件
    爬虫 requests ValueError: check_hostname requires server_hostname
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3525044.html
Copyright © 2011-2022 走看看