201503-4 网络延时

问题描述
  给定一个公司的网络,由 n台交换机和 m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。
  当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑之间传递消息、或者电脑与交换机之间传递消息、或者交换机与交换机之间传递消息最多需要多少步。
输入格式
  输入的第一行包含两个整数 nm,分别表示交换机的台数和终端电脑的台数。
  第二行包含 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。

解題思路

根據題目所給出的關係建立鄰接圖(這裏分為了front和back表示層級關係,但其實合併在一起也可以),選擇第一個電腦終端結點A,以向量記錄A到其他結點的代價(這裏用深度優先搜索算法所得),找出到逹該點代價最高的一結點B,再計算一遍B到其他結點的代價,代價最高的則為答案。

節點A可以選擇任一點,目的是找出代價最高的一點B,再從B找出代價最高者。


代碼

#include <bits/stdc++.h>


using namespace std;


vector<int> dist;


class Point {
  public:
  int front;
  vector<int> back;
  bool step;
  Point(int f) {
  front = f;
  step = false;
}
};


void loop (int s, vector<Point>& v, int count) {
v[s].step = true;
count++;
dist[s] = count;

int target = v[s].front;
if (target != -1 && v[target].step == false) {
loop(target,v,count);
}
for (int i = 0; i < v[s].back.size(); i++) {
target = v[s].back[i];
if (v[target].step == false) {
loop(target,v,count);
}
}
}


int main() {
vector<Point> v;
int n, m;
cin >> n >> m;
Point p1(-1);
v.push_back(p1);
v.push_back(p1);
for (int i = 0; i <= n+m; i++) {
dist.push_back(0);
}

for (int i = 2; i <= n; i++) {
int a;
cin >> a;
Point p(a);
v.push_back(p);
v[a].back.push_back(i);
}
for (int i = 1; i <= m; i++) {
int a;
cin >> a;
Point p(a);
v.push_back(p);
v[a].back.push_back(i+n);
}

vector<Point> v2;
v2 = v;
v2[1+n].step = true;
loop(v2[1+n].front,v2,0);

int big = 0, target = 0;
for (int i = 0; i < dist.size(); i++) {
if (dist[i] > big) {
big = dist[i];
target = i;
}
}

for (int i = 0; i <= n+m; i++) {
dist.push_back(0);
}

v2 = v;
v2[target].step = true;
loop(v2[target].front,v2,0);

big = 0;
for (int i = 0; i < dist.size(); i++) {
if (dist[i] > big) {
big = dist[i];
}
}

cout << big << endl;

return 0;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值