zoukankan      html  css  js  c++  java
  • hust 1032 Jim

    题目描述

    Jim is boss of a big company . There are so many workers in his company that it will take a long time for his command send to all of his workers . One day he want to know how long it will take at least . So he ask you , one of his best programer , to solve the problem . All the workers in Jim's conpany will receive command from only one people . So there is a tree (the root is Jim) identify the order Jim's command will send by . One send command to another will cost 1 minute and anyone can't send command to more than one people at the same time .

    输入

    There will be multiple cases in the input . For each case there will be just one number N (N<=10000) in the first line , then N-1 fellowed , each line with two names: worker1 worker2 , that is to say worker2 send command to worker1 . The name of the workers will only contain characters and the length is at most 5 .

    输出

    Just one number to tell how many minutes it will cost at least .

    样例输入

    5
    Tom Jim
    Bob Jim
    John Tom
    Mily Tom
    

    样例输出

    3
    唉!这个题一直做错,最后是在厚着脸皮问了学长,结果被学长狂虐了,树形dp,膜拜大神他们啊
    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<vector>
    using namespace std;
    
    vector<int>tree[10001];
    map<string,int>people;
    typedef map<string,int>::iterator Itr;
    Itr itr;
    int nowmax;
    bool vis[10001];
    bool cmp(int x,int y){return x>y;}
    
    int dfs(int u)
    {
        int a[10001];
        int sum=tree[u].size();
        if (sum==0) return 0;
        int ans=0,k=0;
        for (int i=0;i<tree[u].size();i++)
        {
            int v=tree[u][i];
            if (!vis[v])
            {
                vis[v]=true;
                a[++k]=dfs(v);
            }
        }
        sort(a+1,a+sum+1,cmp);
        for (int i=1;i<=sum;i++)
        ans=max(ans,a[i]+i);
        return ans;
    }
    
    int main()
    {
        int n,m;
        string str1,str2;
        m=0;
        while (scanf("%d",&n)!=EOF)
        {
            if (n==1)
            {
                cout<<"0"<<endl;
                continue;
            }
            for (int i=0;i<=n;i++) tree[i].clear();
            m=0;
            people.clear();
            for (int i=1;i<=n-1;i++)
            {
                cin>>str1>>str2;
                if(people.count(str1)==0)
                {
                    people[str1]=++m;
                    if (people.count(str2)==0)
                    {
                        people[str2]=++m;
                        tree[m].push_back(m-1);
                    }
                    else tree[people[str2]].push_back(m);
                }
                else
                {
                    if (people.count(str2)==0)
                    {
                        people[str2]=++m;
                        tree[m].push_back(people[str1]);
                    }
                    else tree[people[str2]].push_back(people[str1]);
                }
            }
            int u=people["Jim"];
            memset(vis,0,sizeof(vis));
            vis[u]=true;
            cout<<dfs(u)<<endl;
        }
        return 0;
    }

    毕竟是自己写的程序,加油

    至少做到我努力了
  • 相关阅读:
    从Linux内核中获取真随机数【转】
    linux下pthread_cancel无法取消线程的原因【转】
    LINUX-内核-中断分析-中断向量表(3)-arm【转】
    ARM中断向量表与响应流程【转】
    小任务与工作队列的区别【转】
    GNU Readline 库及编程简介【转】
    Linux 内核同步之自旋锁与信号量的异同【转】
    Professional Linux Kernel Architecture 笔记 —— 中断处理(Part 2)【转】
    Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
    浅谈C语言中的强符号、弱符号、强引用和弱引用【转】
  • 原文地址:https://www.cnblogs.com/chensunrise/p/3721207.html
Copyright © 2011-2022 走看看