SGU149 Computer Network

题解:

与树的路径有关的题目,挺赞的一道题目

首先树的一个节点,他的最远点,要么在他的子树,要么在他的父节点的子树中

那么我们先求出每个节点的子树中的最远点和次远点。然后求父节点的中的最远点。

在父节点中,如果该点不在父节点的最远路径上,那么该父节点的最远点则是最优的,否则次远点是最优的

但是不知道如何实现啊。。。。。。看了别人的代码

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define ll long long
#define CLR(x) memset(x,0,sizeof x)
#define MC(x,y) memcpy(x,y,sizeof(x))
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 2097152
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=10100;
const int mod=1e9+7;

int First_son[maxn],Second_son[maxn],First_fa[maxn];
int First_son_point[maxn];

struct Edge{
    int to,nxt,w;
}edge[maxn*2];

int head[maxn],p[maxn];
int cnt,n,u,w;

void addEdge(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].nxt=head[u];
    head[u]=cnt++;
}

//将无根树化为有根树,根为1
void dfs(int u,int fa){
    p[u]=fa;
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(v!=fa) dfs(v,u);
    }
}

//找子树中的最远节点和次远节点,因为是子树,是从下到上更新,先dfs1
void dfs1(int u){
    First_son[u]=Second_son[u]=0;
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(v==p[u]) continue;
        dfs1(v);
        if(Second_son[u]<First_son[v]+edge[i].w){
            Second_son[u]=First_son[v]+edge[i].w;
            if(First_son[u]<Second_son[u]){
                First_son_point[u]=v;
                swap(First_son[u],Second_son[u]);
            }
        }
    }
}

//找寻父节点中的最远节点,是从上到下,所以是后dfs2
void dfs2(int u){
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(v==p[u]) continue;
        if(v==First_son_point[u]) First_fa[v]=edge[i].w+max(Second_son[u],First_fa[u]);
        else                      First_fa[v]=edge[i].w+max(First_son[u],First_fa[u]);
        dfs2(v);
    }
}

int main(){
    cnt=0;
    memset(head,-1,sizeof(head));
    scanf("%d",&n);
    for(int v=2;v<=n;v++){
        scanf("%d%d",&u,&w);
        addEdge(u,v,w);
        addEdge(v,u,w);
    }
    dfs(1,-1);
    dfs1(1);
    dfs2(1);
    for(int i=1;i<=n;i++) printf("%d\n",max(First_son[i],First_fa[i]));
    return 0;
}
时间: 2024-10-10 17:20:41

SGU149 Computer Network的相关文章

codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either through a direct link, or through a chain of links, by relayi

SGU 149. Computer Network( 树形dp )

题目大意:给N个点,求每个点的与其他点距离最大值 很经典的树形dp...很久前就想写来着...看了陈老师的code才会的...mx[x][0], mx[x][1]分别表示x点子树里最长的2个距离, dfs一遍得到. mx[x][2]表示从x的父亲到x的最长路径长度, 也是dfs一遍得到(具体看代码).最后答案就是max(mx[x][0], mx[x][2]). 时间复杂度O(N) ----------------------------------------------------------

codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either thr

SGU 149. Computer Network

时间限制:0.25s 空间限制:4M: 题意: 给出一颗n(n<=10000)个节点的树,和n-1条边的长度.求出这棵树每个节点到最远节点的距离: Solution: 对于一个节点,我们可以用DFS,在O(n)的时间内求出它的最远节点的距离. 显然对于10000个节点,不可能将每一个节点都这样求. 那么我们来看看,对于一个已经求过的节点我们可以做什么: 假设,有节点k,他有子节点p,两者距离为d 已经求得它的最远节点距离为dis1, 这时对他的子节点p来说,有两种情况: 一种是:p在k的与最远节

Computer Network学习笔记_2

1_5 Traceroute,一种command tool,可以看network内部信息,ISP内部信息. 1_6 理解Network的模块化封装.学习Protocols和Layers,这种构建computer networks的关键机制.封装是越底层的protocol越封装在外面,形成一个protocol stack.每一层都在message加自己的header.当Browser和Server传输信息时,从Brower向下逐层封装,通过物理层传输,再从下到上demultiplexing.在不同

Computer Network学习笔记_1

1_1 开始学习David Weatherall讲的Computer Networks,第一节课主要讲Goals and Motivation,Focus of the course是Networking,讨论packets and internet,会讲底层的Communications和上层的Distributed systems,就是Network如何建立,上层apps能做什么.The main point是学习Internet如何运行,TCP/IP,DNS,HTTP,NAT,VPNs,8

computer network fundamental

Copy from  http://cyberlingo.blogspot.com/2015/10/data-communications-and-networking-2.html List the layers of the Internet model. Physical, Data Link, Network, Transport, Application. Which layers in the Internet model are the network support layers

Computer Network学习笔记_4

3-2_Retransmissions 主讲ARQ,主要用在错误普遍存在而且必须改正的情况,WiFi.TCP都用.ARQ的规则就是recerver收到正确帧要自动回发ACK,sender如果没有在timeout内收到ACK就重发Frame.ARQ有两个问题,一个是timeout定多长,一个是帧重复.Timeout定的时间不能太长太短,解决帧重复就是在Frames和ACKs中加sequence numbers.帧重复的问题是如果sender发的数据receiver收到然后回发的ACK超时,那么se

Computer Network学习笔记_5

4-1_Network_Layer_Overview 一个知识点:routing和forwarding的区别.Routing is the process of deciding in which direction to send traffic-Network wide(global)and expensive.Forwarding is the process of sending a packet on its way-Node process(local) and fast. 因为网络