【poj1987】 Distance Statistics

http://poj.org/problem?id=1987 (题目链接)

题意

  给出一棵树,求树上距离不超过K的点对个数。

Solution

  点分治,同poj1741。

代码

// poj1987
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MOD 100000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=40010;
struct edge {int to,next,w;}e[maxn<<1];
int head[maxn],deep[maxn],d[maxn],size[maxn],f[maxn],vis[maxn];
int n,m,K,cnt,rt,sum,ans;

void link(int u,int v,int w) {
	e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;
	e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].w=w;
}
void calroot(int x,int fa) {
	size[x]=1;f[x]=0;
	for (int i=head[x];i;i=e[i].next)
		if (!vis[e[i].to] && e[i].to!=fa) {
			calroot(e[i].to,x);
			size[x]+=size[e[i].to];
			f[x]=max(f[x],size[e[i].to]);
		}
	f[x]=max(f[x],sum-size[x]);
	if (f[x]<f[rt]) rt=x;
}
void caldeep(int x,int fa) {
	deep[++deep[0]]=d[x];
	for (int i=head[x];i;i=e[i].next)
		if (!vis[e[i].to] && e[i].to!=fa) {
			d[e[i].to]=d[x]+e[i].w;
			caldeep(e[i].to,x);
		}
}
int cal(int x,int now) {
	d[x]=now;deep[0]=0;
	caldeep(x,0);
	sort(deep+1,deep+deep[0]+1);
	int t=0;
	for (int l=1,r=deep[0];l<r;) {
		if (deep[l]+deep[r]<=K) t+=r-l,l++;
		else r--;
	}
	return t;
}
void solve(int x) {
	vis[x]=1;
	ans+=cal(x,0);
	for (int i=head[x];i;i=e[i].next) if (!vis[e[i].to]) ans-=cal(e[i].to,e[i].w);
	for (int i=head[x];i;i=e[i].next) if (!vis[e[i].to]) {
			rt=0;sum=size[e[i].to];
			calroot(e[i].to,0);
			solve(rt);
		}
}
int main() {
	scanf("%d%d",&n,&m);
	char ch;
	for (int u,v,w,i=1;i<=m;i++) {
		scanf("%d%d%d %c",&u,&v,&w,&ch);
		if (u==v) continue;
		link(u,v,w);
	}
	scanf("%d",&K);
	rt=0;sum=n;f[0]=inf;
	calroot(1,0);
	solve(rt);
	printf("%d",ans);
	return 0;
}

  

时间: 2024-10-20 21:55:07

【poj1987】 Distance Statistics的相关文章

【POJ1987】Distance Statistics ==【POJ1741】 树分治

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44307489"); } 题意&题解 http://blog.csdn.net/vmurder/article/details/44302921 代码:(同一道题) #include <cstdio> #inclu

【poj1986】 Distance Queries

http://poj.org/problem?id=1986 (题目链接) 题意 给出一棵树,询问树上两点间距离 Solution lca. 代码 // poj1985 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #defi

【XSY2411】【CF161D】Distance in Tree

\(Description\) 一棵树是一个不含环的连通图. 树上两点间的距离是两点间最短路径的长度(边的). 给你一棵\(n\)个点的树和一个正整数\(k\).找出不同的距离为\(k\)的点对的数量.注意点对\((u,v)\)和\((v,u)\)被认为是相同的. \(Input\) 第一行包含两个整数\(n\)和\(k\) \((1≤n≤50000,1≤k≤500)\)--点数和要求的两点间距离. 接下来\(n-1\)行代表了边\("a_{i}\) \(b_{i}"\)(没有引号)\

【leetcode】Edit Distance 详解

下图为TI C6xx DSP Nyquist总线拓扑图,总线连接了master与slave,提供了高速的数据传输.有很多种速率不同的总线,如图中的红色方框,最高速总线为CPU/2 TeraNet SCR(即VBUSM SCR),带宽为256bit,其他低速总线为CPU/3,CPU/6,带宽参考图中所示.总线之间用Bridge(桥)连接,作用包括转换总线的速率,使之与所流向总线的速率相同等. 在具体应用中,各种速率的总线完全可以满足复杂的数据传输,而数据传输的瓶颈往往在于连接总线之间的Bridge

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

【LeetCode】161. One Edit Distance

Difficulty: Medium  More:[目录]LeetCode Java实现 Description Given two strings S and T, determine if they are both one edit distance apart. Intuition 同时遍历比较S和T的字符,直至遇到不同的字符:如果S和T的字符个数相同时,跳过不同的那个字符,继续遍历:如果S和T的字符个数相差为1时,跳过较长的字符串的当天字符,继续遍历.如果剩下的字符都相等,那么返回tr

LeetCode | 1385. Find the Distance Value Between Two Arrays两个数组间的距离值【Python】

LeetCode 1385. Find the Distance Value Between Two Arrays两个数组间的距离值[Easy][Python][暴力] Problem LeetCode Given two integer arrays arr1 and arr2, and the integer d, return the distance value between the two arrays. The distance value is defined as the nu

POJ1987——Distance Statistics

Distance Statistics Time Limit: 2000MS   Memory Limit: 64000K Total Submissions: 1667   Accepted: 532 Case Time Limit: 1000MS Description Frustrated at the number of distance queries required to find a reasonable route for his cow marathon, FJ decide

机器学习资源大全【转】

本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). C++ 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统. 通用机器学习 MLPack DLib ecogg shark Closure 通用机器学习 Closure Toolbox—Clojure语言库与工具的分类目录 Go 自然语