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;
}

ccf部分题目及答案

CCF部分机考题题目收集: 参照网上的题目和答案,自己也把这些题一个个敲代码实现了一遍,现记录下来,以防忘记。 题目一: 问题描述 试题编号: 试题名称: 时间限制: 内存限制: 201509-1 数...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

CCF认证历年试题集

来源:CCF计算机职业资格网站。 CCF201703试题 CCF201612试题 CCF201609试题 CCF201604试题 CCF201512试题 CCF201509试题 CCF20150...

Struts2使用IntelljiIDEA和maven管理:搭建开发环境

Struts2使用IntelljiIDEA和maven管理:搭建开发环境在对spring比较熟悉之后,决心学习一下另一个很流行的框架Struts2,奈何资料比较老旧,也没有采用maven和intell...

使用Maven搭建Struts2框架的开发环境

一、创建基于Maven的Web项目               我使用的是MyEclipse8.5的版本,创建好的Web项目如下所示:      我们知道,一个标准的Maven项目是必须...

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

试题编号:    201503-1 试题名称:    图像旋转 时间限制:    5.0s 内存限制:    256.0MB 问题描述:     问题描述   旋转是图像处理的基本操作,在...

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

问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. b...

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

问题描述   涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。 输入格式  ...

CCF 历年真题之学生排队(_1703_2_StudentQueueUp.java)参考答案

CCF 历年真题之学生排队(_1703_2_StudentQueueUp.java)参考答案 問題描述: 试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s ...
  • Dina_p
  • Dina_p
  • 2017年07月17日 15:38
  • 677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CCF历届真题练习答案整理(二)
举报原因:
原因补充:

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