树的直径
2016-04-08 00:38
225 查看
问题描述
给定一个公司的网络,由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
样例说明
样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑:
其中电脑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。
题解
这里我们可以发现电脑和交换机并没有区别,花费时间就是两个点的路径的长度,而且这是一棵树,就是找所有点对中距离最长的,就是树的直径。求两边bfs即可#include<stdio.h> #include<stdlib.h> #define white 1 #define gray 2 #define black 3 typedef struct edge{ int i; struct edge *next; }edge; typedef struct node{ int d,color; edge *next; }node; typedef struct gve{ int v,e; node *g; }gve; int insert(node *pnode,int i) { edge *New; New=(edge *)malloc(sizeof(edge)); New->i=i; New->next=pnode->next; pnode->next=New; return 0; } int print(gve G) { int i; for (i=1;i<=G.v;i++) { edge *tmp; tmp=G.g[i].next; printf("%d: ",i); while (tmp!=NULL) { printf("%d ",tmp->i); tmp=tmp->next; } printf("\n"); } return 0; } typedef struct queue{ int n,size,head,tail; int *q; }queue; int enque(queue *que,int s) { if (que->n==que->size) { printf("que overflow!\n"); return 0; } que->tail=que->tail==que->size-1?0:que->tail+1; que->q[que->tail]=s; que->n++; return 0; } int deque(queue *que) { if (que->n==0) { printf("queue underflow!"); return 0; } que->head=que->head==que->size-1?0:que->head+1; que->n--; return 0; } int bfs(gve G,int s)//返回离s点最远的点编号 { queue que; que.size=G.v; que.q=(int *)malloc(sizeof(int)*G.v); que.n=0; que.head=0; que.tail=-1; enque(&que,s); edge *tmp; while (que.n!=0) { tmp=G.g[que.q[que.head]].next; while (tmp!=NULL) { if (G.g[tmp->i].color==white) { G.g[tmp->i].color=gray; G.g[tmp->i].d=G.g[que.q[que.head]].d+1; enque(&que,tmp->i); } tmp=tmp->next; } G.g[que.q[que.head]].color=black; deque(&que); } if (que.head==0) return que.q[que.size-1]; else return que.q[que.head-1];//最后一次出列的点是s点 } int main(void) { int n,m,i; gve G; scanf("%d%d",&n,&m); G.v=n+m; G.e=(G.v-1)*2; G.g=(node *)malloc(sizeof(node)*(G.v+1)); for (i=1;i<=G.v;i++) { G.g[i].d=0; G.g[i].next=NULL; G.g[i].color=white; } int p; for (i=2;i<=n+m;i++) { scanf("%d",&p); insert(&G.g[p],i); insert(&G.g[i],p); } int s; s=bfs(G,1); for (i=1;i<=G.v;i++) { G.g[i].d=0; G.g[i].color=white; } s=bfs(G,s); printf("%d",G.g[s].d); return 0; }
相关文章推荐
- BZOJ 1022([SHOI2008]小约翰的游戏John-无法操作者赢的nim)
- c# 修饰符总结
- Android MVC 设计模式
- laravel学习(一)-laravel安装
- HDOJ 1303 Doubles(简单题)
- HDOJ 1303 Doubles(简单题)
- zookeeper的安装配置
- CSS之Position详解
- ASP.NET Web API 学习【转】
- 周记
- Java 加载配置文件的方式
- Ruby之基本数据类型(三)
- 【MFC】:制作的多个对话框字体颜色不一致问题的解决方案
- 委托,线程,同步,异步的学习(一)
- poj 1001 代码
- DNS Type
- 周记 改
- 为WebSphere Application Server v8.5安装并配置JDK7
- eclipse开发环境搭建
- php 字符串函数汇总