CCF 201503-4 网络延时(求树的直径)

来源:互联网 发布:excel把多列数据合并 编辑:程序博客网 时间:2024/05/17 01:56

问题描述
  给定一个公司的网络,由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
样例输入
4 4
1 2 2
3 4 4 4
样例输出
4


思路:直接看做n+m个点的一棵树,求树的直径即可。

//#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include<string.h>#include<vector>#include<queue>#include<algorithm>#include<stdio.h>#include<math.h>#include<map>#include<stdlib.h>#include<time.h>#include<stack>#include<set>#include<deque>using namespace std;typedef long long ll;const int N=100010;int head[N];int ip;struct edgenode{int to;int next;} tu[N*2];void init(){ip=0;memset(head,-1,sizeof(head));}void add(int u,int v){tu[ip].to=v,tu[ip].next=head[u],head[u]=ip++;}int st,ed,len;void dfs(int now,int pre,int sum){if(sum>len)len=sum,st=now;for(int k=head[now]; k!=-1; k=tu[k].next){int to=tu[k].to;if(to!=pre)dfs(to,now,sum+1);}}int main(){int n,m;cin>>n>>m;init();for(int i=2; i<=n; i++){int a;scanf("%d",&a);add(i,a);add(a,i);}for(int i=n+1; i<=n+m; i++){int b;cin>>b;add(i,b);add(b,i);}len=0;st=1;dfs(1,-1,0);ed=st;len=0;dfs(st,-1,0);cout<<len<<endl;return 0;}



0 0
原创粉丝点击