插排树【牛客练习赛24】【并查集的变形】
程序员文章站
2022-07-07 20:23:26
...
题目描述
一年一度的山东省oi夏令营又开始了,每到这个季节,山东的oier们都会欢聚这里,一起学(tuí)习(feì)。当然,为了能更加愉快地学(tuí)习(feì),就少不了要自带电脑,用电便开始成了一种问题,于是便有一种神奇的数据结构诞生了!这就是山东省oi专用数据结构——插排树(如图)
小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;
}
上一篇: 尼玛这真是亲弟弟啊
下一篇: 博客园去google广告加载方法