CCF 2015-03-4 网络延时

题目:http://115.28.138.223/view.page?gpid=T24

题意就是让求树上的任意两个节点间的距离的最大值。就是树的直径。

首先树的直径模板转载自http://www.07net01.com/2015/08/908766.html

模板思路是先任意确定一个点a,加入到队列当中。然后对这个点用广搜找到和它距离最远的点b。然后用相同的方法对点b找距离它最远的点。这个距离就是要求的直径。

实现:因为求树的直径题目数据量往往比较大,所以用邻接表来储存数据;至于对两个端点的查找通过bfs实现,先将第一次选择的起点a队。 然后开始搜索与a连接的所有边,并将权值存入dis[]数组 dis[x]=dis[top]+edge[i].w(dis[x]指的是当前搜索到的点 与之前与它相连的搜索过边的总权值,dis[top]是指当前搜索到的点的之前与它相连的搜索过边的总权值,edge[i].w是点top到当前搜索到的点 的连线的权值)完成于对当前点的搜索后,将其入队,然后对下 一个点进行此操作,每次搜索时,同时将最大的权值存入sum中如此重复直至队列为空,这样这个搜素结束后,sum的值就是a点到距离其最远的点b的总权值之和;此时再以b为起点进行第二次搜索(第 二次搜 索步骤与第一次相同)

其实就是简单的邻接表应用。只是在下不太熟。于是,觉得很机智。。。。。

#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 10010
using namespace std;

int head[maxn*3];
int vis[maxn*3];  // 判断每个节点是否已经被访问过。
int dis[maxn*3];  //存储每个节点到当前节点的路径长
int que[maxn*3];
int edgeNum;
int n, m;
int ans;
int sum;

struct Edge {
   int v, c, nxt;
}edge[maxn*4];  // T_T哭晕...居然三倍的会TLE...TLE...

void addEdge(int a, int b, int c) {
    edge[edgeNum].v = b;
    edge[edgeNum].c = c;
    edge[edgeNum].nxt = head[a];
    head[a] = edgeNum++;
}

void getMap() {
    edgeNum = 0;
    memset(head, -1, sizeof(head));
    for (int i=2; i<=n; ++i) {
      int temp;
      scanf("%d", &temp);
      addEdge(temp, i, 1);
      addEdge(i, temp, 1);
    }
    for (int i=1; i<=m; ++i) {
      int temp;
      scanf("%d", &temp);
      addEdge(temp, i+n, 1);
      addEdge(i+n, temp, 1);
    }
}

void bfs(int num) {
    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    ans = num;
    sum = 0;
    int front = -1, rear = 0;
    que[++front] = num;
    while(front >= rear) {
        int top = que[front--];
        for (int i=head[top]; i!=-1; i=edge[i].nxt) {
           int v = edge[i].v;
           if (!vis[v]) {
              dis[v] = dis[top] + edge[i].c;
              vis[v] = 1;
              que[++front] = v;
              if (sum < dis[v]) {
                sum = dis[v];
                ans = v;
              }
           }
        }
    }
}

int main() {
    while(~scanf("%d%d", &n, &m)) {
       getMap();
       bfs(1);
       bfs(ans);
       printf("%d\n", sum);
    }
    return 0;
}

还有某大神做的一种,转载自:http://www.cnblogs.com/hate13/p/4643573.html

用DP。求出每个点的和所有点之间的距离的最大值和第二大值。然后它们的和的最大值就是树的直径。

初始化父亲节点的两个距离都是0。然后如果子节点最大值+1大于父亲节点的最大值。更新父亲节点的两个值。否则如果子节点最大值+1大于父亲节点的第二大值。那么只更新第二大值就可以了。

更机智。有木有。。(⊙o⊙)…额。。还是在下水平低。。

#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 10010
using namespace std;

int head[maxn*3];
int n, m;
int dp[maxn*4][2];
int edgeNum;

struct Edge {
   int v,nxt;
}edge[maxn*4];  // T_T哭晕...居然三倍的会TLE...TLE...

void addEdge(int a, int b) {
    edge[edgeNum].v = b;
    edge[edgeNum].nxt = head[a];
    head[a] = edgeNum++;
}

void getMap() {
    edgeNum = 0;
    memset(head, -1, sizeof(head));
    for (int i=2; i<=n; ++i) {
      int temp;
      scanf("%d", &temp);
      addEdge(temp, i);
      //addEdge(i, temp, 1);
    }
    for (int i=1; i<=m; ++i) {
      int temp;
      scanf("%d", &temp);
      addEdge(temp, i+n);
      //addEdge(i+n, temp, 1);
    }
}

void dfs(int u) {
    dp[u][0] = dp[u][1] = 0;
    for (int i=head[u]; i!=-1; i=edge[i].nxt) {
       int v = edge[i].v;
         dfs(v);
       if (dp[v][0]+1 >= dp[u][0]) {
         dp[u][1] = dp[u][0];
         dp[u][0] = dp[v][0]+1;
       }
       else if (dp[v][0]+1 > dp[u][1]) {
          dp[u][1] = dp[v][0]+1;
       }
    }
}

int main() {
    while(~scanf("%d%d", &n, &m)) {
       getMap();
       dfs(1);
       int sum = 0;
       for (int i=1; i<=n+m; ++i) {
        int temp = dp[i][0] + dp[i][1];
        sum = max(temp, sum);
       }
       printf("%d\n", sum);
    }
    return 0;
}

时间: 2024-10-05 20:53:25

CCF 2015-03-4 网络延时的相关文章

CCF真题之网络延时

201503-4 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为1.其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1.所有的终端电脑都直接连接到交换机上. 当信息在电脑.交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机.请问,电脑与电脑之间传递消息.或者电脑与交换机之间传递消息.或者交换机与交换机之间传递消息最多需要多少步. 输入格

[ccf 4] 网络延时

网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为 1.他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1.所有的终端电脑都直接连接到交换机上. 当信息在电脑.交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机.请问,电脑与电脑之间传递消息.或者电脑与交换机之间传递消息. 或者交换机与交换机之间传递消息最多需要多少步. 输入格式 输

Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test    public void  test1()    {        Session session = null;         try {             session = Hiber

2015全球未来网络暨SDN技术大会

2015全球未来网络暨SDN技术大会实时直播:http://www.sdnlab.com/2015-future-network/

ping 监控网络延时

环境 windows系统 需求 通过ping监控网络状态 解决 DOS中添加一个loop循环,以便监控ping状态,并命名一个文件名,注意根据需要给log.txt添加目录. :top echo %time%>>log.txt ping -n 1 IP  Address | findstr "TTL">> log.txt goto top 注意: 命名的文件名称一定不可以是ping 否则会出现错误 另一个程序正在使用此文件,进程无法访问.出现该问题的原因是因为 p

iOS 学习笔记 六 (2015.03.28)常见错误

2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' objects You own any object you create You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, 

OpenSCAD 2015.03的大变化,更方便了。

OpenSCAD 2015.03出来了,有几个大的变化: 1.增加工具按钮,操作起来更方便,尤其是在Mac OS X的窗口全屏模式下. 2.坐标的标尺显示尺寸的刻度,这个对3D打印的模型设计很方便. 3.代码编辑器支持代码块折叠和自动缩进等专业代码编辑器的一些特征了. 注意:一定要自己下最新版的才有这个功能哦,我用mac port装的最新才14.03,没有这些个功能. 顺便唠叨下:到http://www.thingiverse.com,在搜索框输入openscad,可以找到大量的采用OpenSC

2015年下半年网络工程师考试报名相关事宜

2015年上半年的软考网络工程师考试告一段落,不管你是准备考还是重新考,都应该知道下半年的报名开始了!今天我们就来说说网络工程师报名的一些相关知识吧~ 网络工程师是软考中级资格考试里面的一项考试.网络工程师能够从事计算机信息系统的设计.建设.运行和维护工作. 网络工程师的考试资格对报考者的年龄.学历.专业.工作背景等不做任何限制,只要达到相应的技术水平就可以报考相应的级别. 2015年下半年的全国报名时间一般从7月份陆续开始,到9月份结束.软考报名时间跨度较大,各地情况不同,详细情况需要查看每一

CCF 201503-4 网络延时

题目来自2015年03月CCF计算机职业资格认证考试 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为1.其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1.所有的终端电脑都直接连接到交换机上. 当信息在电脑.交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机.请问,电脑与电脑之间传递消息.或者电脑与交换机之间传递消息.或者交换机与交换机

15年3月CCF真题4-网络延时

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