CCF历届真题练习答案整理(二)

转载 2015年07月09日 16:19:15
试题编号:    201503-4
试题名称:    网络延时
时间限制:    1.0s
内存限制:    256.0MB
问题描述:    
问题描述
  给定一个公司的网络,由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

#include<iostream>
#include
<vector>
#include
<cstring>
#include
<algorithm>
#include
<cstdio>
using namespace std;
const int N = 222222;
int edgeCount,firstEdge[N], to[N], length[N], nextEdge[N];
vector<int> dist;
void addEdge(int u, int v, int w){
   
to[edgeCount] = v;
   
length[edgeCount] = w;
   
nextEdge[edgeCount] = firstEdge[u];
   
firstEdge[u] = edgeCount++;
}
void dfs(int p, int u, int d){
   
dist[u] = d;
   
for(int iter = firstEdge[u]; iter != -1; iter = nextEdge[iter]){
       
if(to[iter] != p){
           
dfs(u, to[iter], d+length[iter]);
        }
    }
}
int getDiameter(int nodeCount, vector <pair <pair <int, int>, int> > edges){
   
edgeCount = 0;
   
memset(firstEdge, -1, sizeof(firstEdge));
   
for(vector<pair <pair <int, int>, int> >::iterator iter = edges.begin();
        iter != edges.
end();++iter){
       
addEdge(iter->first.first,iter->first.second, iter->second);
       
addEdge(iter->first.second,iter->first.first, iter->second);
    }
   
dist.resize(nodeCount);
   
dfs(-1, 0, 0);
   
int u = max_element(dist.begin(), dist.end()) - dist.begin();
   
dfs(-1,u,0);
   
return *max_element(dist.begin(), dist.end());
}
int main(){
   
int n, m, v;
   
vector <pair <pair <int, int>, int> > edges;
   
scanf("%d%d",&n,&m);
   
for(int i=1;i<=n-1;++i){
       
scanf("%d",&v);
        edges.
push_back(make_pair(make_pair(v-1, i),1));
        edges.
push_back(make_pair(make_pair(i, v-1),1));
    }
   
for(int i=n;i<=n+m-1;++i){
       
scanf("%d",&v);
        edges.
push_back(make_pair(make_pair(v-1, i),1));
        edges.
push_back(make_pair(make_pair(i, v-1),1));
    }
   
printf("%d\n",getDiameter(n+m, edges));
   
return 0;
}

相关文章推荐

CCF201604-2 俄罗斯方块(100分)

试题编号: 201604-2 试题名称: 俄罗斯方块 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   俄罗斯方块是俄罗斯人阿列克谢·帕基特...

CCF历届真题练习答案整理(一)

试题编号:    201503-1 试题名称:    图像旋转 时间限制:    5.0s 内存限制:    256.0MB 问题描述:   ...

CCF201609-2 火车购票(100分)

试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   请实现一个铁路购票系统的简单座位分配算...

CCF201612试题

来源:CCF计算机职业资格网站。 试题编号: 201612-1 试题名称: 中间数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描...

CCF201512试题

来源:CCF计算机职业资格网站。 试题编号: 201512-1 试题名称: 数位之和 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问...

CCF201312--模拟练习试题参考答案(Java)

来源:CCF计算机职业资格网站。 问题参见:CCF201312赛题。 为了帮助大家熟悉 CCF 软件能力认证考试的操作方式与答题环境,了解试题的大致难度,做好考前的准备,故在此提供试题的参考...

CCF201609试题

来源:CCF计算机职业资格网站。 试题编号: 201609-1 试题名称: 最大波动 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问...

CCF201312--模拟练习试题参考答案(C++)

来源:CCF计算机职业资格网站。 为了帮助大家熟悉 CCF 软件能力认证考试的操作方式与答题环境,了解试题的大致难度,做好考前的准备,故在此提供试题的参考答案。C++程序是灵活的,为了解决同一个...

CCF201312试题

来源:CCF计算机职业资格网站。 试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)