黑马星云 2021-07-01 19:45 采纳率: 100%
浏览 26
已结题

求代码!!!!!!!!!!!!!!

开开特别喜欢玩一款叫作王者荣耀的游戏,并且多次在高校杯获得冠军。作为冠军打野,开开决定给朋友们出一篇打野路线教程: “首先,作为打野,我们从泉水出发后,应该前往不同的野怪处打野,打完之后再决定下一只野怪打什么。当然,我们知道,同一处的野怪在一定时间内只有一只,所以一旦我们从一处野怪离开后,便没有回头路可走了。此外,每打一只野怪可以获得1点快乐值。刚进入游戏时,我们在泉水的初始快乐值为1点”。 已知,开开在教程中提供了所有可能的打野路线,如果想要尽可能获得更多的快乐,聪明的你可以帮他算一算开开最大的快乐值是多少吗? 开开的其他攻略: ① 开开非常喜欢树,所以包括泉水在内的打野路线为一个树形结构。开开从泉水出发,不断前进,击败遇到的所有野怪,直到无路可走。 ② 泉水和野怪都可以看作树上的一个节点,某些节点之间存在单向边,将所有的节点从1到n编号。 输入格式:

第一行两个正整数n(1<=n<=1e5)和r,分别表示树的节点数和泉水的标号。 




接下来n行,每个两个正整数u和v,表示有一条从u到v的边。 

输出格式:

一个正整数,开开最大能获得的快乐值。 限制:

空间限制:128MByte 时间限制:1秒 样例:

输入:

5 1 1 2 1 3 3 4 3 5 输出:

3

  • 写回答

1条回答 默认 最新

  • lyh不会打代码 2023-01-18 17:47
    关注
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    using namespace std;
     
    int n,numw;
    const int N=1e5+100;
    struct head
    {
        int first;
    }heads[N];
     
    struct edge
    {
        int to;
        int next;
    }edges[N];
    int len;
    int maxsum=1;
    int addrode(int u,int v);
    void dfs(int root,int sum);
    int main()
     
        cin>>n>>numw;
        int u,v;
        for(int i=1;i<=n-1;i++)
        {
            scanf("%d%d",&u,&v);
            addrode(u,v);
        }
        dfs(numw,1);
        cout<<maxsum;
        return 0;
    }
     
    int addrode(int u,int v)
    {
        edges[++len].to = v;
        edges[len].next = heads[u].first;
        heads[u].first = len;
    }
     
    void dfs(int root,int sum)
    {
        if(heads[root].first == 0)
        {
            maxsum = max(maxsum,sum);
            return;
        }
        int root1=heads[root].first;
    //    cout<<heads[root].first<<' ';
        while(1)
        {
            dfs(edges[root1].to,sum+1);
            root1 = edges[root1].next;
            if(root1 == 0)
                break;
        }
    }
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 专家已采纳回答 8月22日