试题编号: | 201503-4 |
试题名称: | 网络延时 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。 输入格式 输入的第一行包含两个整数n, m,分别表示交换机的台数和终端电脑的台数。 输出格式 输出一个整数,表示消息传递最多需要的步数。 样例输入 4 2 样例输出 4 样例说明 样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑: 其中电脑1与交换机4之间的消息传递花费的时间最长,为4个单位时间。 样例输入 4 4 样例输出 4 样例说明 样例的网络连接模式如下: 其中电脑1与电脑4之间的消息传递花费的时间最长,为4个单位时间。 评测用例规模与约定 前30%的评测用例满足:n ≤ 5, m ≤ 5。 |
#include<iostream>
#include<vector>
using namespace std;
//重点!!!!找到最长的一条路径,从这条路径的叶子去与每个结点的路径对比,获取距离。即目标路线一定包括树高最高的叶子结点
typedef struct Node{
vector<double> connect;//记录从根到该点的路径
int len;
}Node;
int n,m,t;
Node swa[10001],com[10001];
int main(){
cin>>n>>m;
int mx=0,id=1,type=0;
swa[1].connect.push_back(1.1);swa[1].len=1;
for(int i=2;i<=n;i++){
cin>>t; //i连接到t
swa[i].connect=swa[t].connect;//每输入一个点,获取其父节点的路径
swa[i].connect.push_back(i+0.1);//再把自己计入路径,+0.1是标记交换机
swa[i].len=swa[t].len+1;
if(swa[i].len>mx){//记录最长长度叶子结点的类型,编号,长度
mx=swa[i].len;
id=i;type=0;
}
}
for(int i=1;i<=m;i++){
cin>>t; //i连接到t
com[i].connect=swa[t].connect;//每输入一个点,获取其父节点的路径
com[i].connect.push_back(i+0.2);//再把自己计入路径,加0.2是标记电脑
com[i].len=swa[t].len+1;
if(com[i].len>mx){//记录最长长度叶子结点的类型,编号,长度
mx=com[i].len;
id=i;type=1;
}
}
vector<double> st;//记录最长的一条路径
int ans=-1;
if(type==0)st=swa[id].connect;
if(type==1)st=com[id].connect;
for(int i=1;i<=n;i++){//拿st与每个交换机对比路径
vector<double> temp=swa[i].connect;
int a=0,res=0;
while(a<st.size() && a<temp.size()){
if(st[a]!=temp[a])break;
a++;
}
res=st.size()-a+temp.size()-a;
if(ans<res)ans=res;
}
for(int i=1;i<=m;i++){//拿st与每个电脑对比路径
vector<double> temp=com[i].connect;
int a=0,res=0;
while(a<st.size() && a<temp.size()){
if(st[a]!=temp[a])break;
a++;
}
res=st.size()-a+temp.size()-a;
if(ans<res)ans=res;
}
cout<<ans;
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答