欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

插排树【牛客练习赛24】【并查集的变形】

程序员文章站 2022-07-07 20:23:26
...

题目描述 

一年一度的山东省oi夏令营又开始了,每到这个季节,山东的oier们都会欢聚这里,一起学(tuí)习(feì)。当然,为了能更加愉快地学(tuí)习(feì),就少不了要自带电脑,用电便开始成了一种问题,于是便有一种神奇的数据结构诞生了!这就是山东省oi专用数据结构——插排树(如图)

插排树【牛客练习赛24】【并查集的变形】

小K为了能更好的学(tuí)习(feì),所以他想尽量的往后做,所以现在请你帮帮他,他最远可以离讲台多远。

已知插排树的根节点在讲台上,有且仅有一个根节点(根节点入度为0),最远距离即所有插排的长度,小K电脑线的长度忽略不计

 

本题良心大样例下载地址: https://kench.co/tree.zip

输入描述:

第一行一个整数n表示有n个节点
然后n-1行,每行三个整数a,b,c,表示插排a是接在插排b上的,插排a的长度为c

输出描述:

一个整数n表示最远距离

示例1

输入

复制

9
2 1 2
3 1 2
4 1 1
5 2 3
6 2 1
7 3 1
8 3 4
9 7 5

输出

复制

8

说明

1=>3=>7=>9

备注:

对于30%的数据 n<233
对于70%的数据 n<2333

对于100%的数据 n<50000

c小于20

a,b小于等于n

 

一开始用了一个DFS搜索+优先队列对最长路的排序,后来发现会WA,然后在考虑题目的意思,发现可以用最近学的图论的——并查集然后开始展开,可能是最近做的题有点偏向这方面吧,然后就给写出来了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
struct vond
{
    int nex_id,cost;
    vond(int a=0, int b=0) {nex_id=a; cost=b;}
};
int root[50005];
int dis[50005];
int maxx=0;
int fid(int x)
{
    if(x==root[x]) return x;
    int temp=fid(root[x]);
    dis[x]+=dis[root[x]];
    if(maxx<dis[x]) maxx=dis[x];
    return root[x]=temp;
}
void mix(int x, int y, int cost)      //把x插到y上
{
    int u=fid(x);
    int v=fid(y);
    dis[u]=cost+dis[y];
    root[u]=v;
}
int N;
int main()
{
    while(scanf("%d",&N)!=EOF)
    {
        for(int i=1; i<=N; i++) root[i]=i;
        maxx=0;
        memset(dis, 0, sizeof(dis));
        for(int i=1; i<N; i++)
        {
            int e1,e2,e3;
            scanf("%d%d%d",&e1,&e2,&e3);
            mix(e1, e2, e3);
        }
        for(int i=1; i<=N; i++) fid(i);
        printf("%d\n",maxx);
    }
    return 0;
}

 

相关标签: 并查集