zoukankan      html  css  js  c++  java
  • [ccf 4] 网络延时

    网络延时
    问题描述
      给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为
         1。他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。
      当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑之间传递消息、或者电脑与交换机之间传递消息、
          或者交换机与交换机之间传递消息最多需要多少步。
    输入格式
      输入的第一行包含两个整数n, m,分别表示交换机的台数和终端电脑的台数。
      第二行包含n - 1个整数,分别表示第2、3、……、n台交换机所连接的比自己上一层的交换机的编号。第i台交换机所连接的上一层的交换机编号一定比自己的编号小。
      第三行包含m个整数,分别表示第1、2、……、m台终端电脑所连接的交换机的编号。
    输出格式
      输出一个整数,表示消息传递最多需要的步数。
    样例输入
         4 2
         1 1 3
         2 1
    样例输出
         4
    样例说明
      样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑:

      其中电脑1与交换机4之间的消息传递花费的时间最长,为4个单位时间。
    样例输入
         4 4
         1 2 2
         3 4 4 4
    样例输出
         4
    样例说明
      样例的网络连接模式如下:

      其中电脑1与电脑4之间的消息传递花费的时间最长,为4个单位时间。
    评测用例规模与约定
      前30%的评测用例满足:n ≤ 5, m ≤ 5。
      前50%的评测用例满足:n ≤ 20, m ≤ 20。
      前70%的评测用例满足:n ≤ 100, m ≤ 100。
      所有评测用例都满足:1 ≤ n ≤ 10000,1 ≤ m ≤ 10000
     
    简单题、不知道为什么考试的时候只得了80分,= =
    重写了一下 100分
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define ll long long
    #define N 200010
    #define M 10*N
    
    struct Edge{
        int to,next;
    }edge[M];
    int tot;
    int head[N];
    
    int n,m;
    int dp[N][2];
    
    void init()
    {
        tot=0;
        memset(head,-1,sizeof(head));
    }
    void add(int u,int v)
    {
        edge[tot].to=v;
        edge[tot].next=head[u];
        head[u]=tot++;
    }
    void dfs(int u)
    {
        dp[u][0]=dp[u][1]=0;
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;
            dfs(v);
            if(dp[v][0]+1>=dp[u][0]){
                dp[u][1]=dp[u][0];
                dp[u][0]=dp[v][0]+1;
            }
            else if(dp[v][0]+1>dp[u][1])
                dp[u][1]=dp[v][0]+1;
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            init();
            for(int i=2;i<=n;i++){
                int x;
                scanf("%d",&x);
                add(x,i);
            }
            for(int i=1;i<=m;i++){
                int x;
                scanf("%d",&x);
                add(x,i+n);
            }
            dfs(1);
            int ans=0;
            for(int i=1;i<=n+m;i++) ans=max(ans,dp[i][0]+dp[i][1]);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/hate13/p/4643573.html
Copyright © 2011-2022 走看看