2671 .1741c在那

宜春钽铌矿
您的位置:
【】【】【】
&留言主题:discount cialis pills from india
【】 发表日期: 23:03:05
【留言者】 cbrrssmp
cbrrssmp说:
&留言主题:PRlTprAQueHHpadS
【】 发表日期: 23:01:33
【留言者】 Robert
Robert说:
There's a three month trial period
10. Once you click on the activation link in the email, your account will have been activated and is ready
register directly with the nearest U.S. Embassy or Consulate. By registering, American
&留言主题:viagra sildenafil 50mg
【】 发表日期: 23:01:27
【留言者】 qmyspvgh
qmyspvgh说:
&留言主题:PRlTprAQueHHpadS
【】 发表日期: 23:01:25
【留言者】 Christopher
Christopher说:
Special Delivery
knee length or longer or dress pants and blouses. However if you are attending class at the school
In January 2008, TELUS demonstrated its strategic commitment to healthcare with the acquisition of Emergis and now operates
共28544条&共有页
宜春钽铌矿版权所有 您是第
宜春市电信分公司增值业务部 技术支持4866人阅读
POJ(218)
数据结构(75)
题意就是求树上距离小于等于K的点对有多少个
n2的算法肯定不行,因为1W个点
这就需要分治。可以看09年漆子超的论文
本题用到的是关于点的分治。
一个重要的问题是,为了防止退化,所以每次都要找到树的重心然后分治下去,所谓重心,就是删掉此结点后,剩下的结点最多的树结点个数最小。
每次分治,我们首先算出重心,为了计算重心,需要进行两次dfs,第一次把以每个结点为根的子树大小求出来,第二次是从这些结点中找重心
找到重心后,需要统计所有结点到重心的距离,看其中有多少对小于等于K,这里采用的方法就是把所有的距离存在一个数组里,进行快速排序,这是nlogn的,然后用一个经典的相向搜索O(n)时间内解决。但是这些求出来满足小于等于K的里面只有那些路径经过重心的点对才是有效的,也就是说在同一颗子树上的肯定不算数的,所以对每颗子树,把子树内部的满足条件的点对减去。
最后的复杂度是n logn logn & &其中每次快排是nlogn 而递归的深度为logn
#include &iostream&
#include &algorithm&
#include &cstring&
#include &string&
#include &cstdio&
#include &cmath&
#include &queue&
#include &map&
#include &set&
#define eps 1e-5
#define MAXN 11111
#define MAXM 55555
#define INF
struct EDGE
int v, next,
}edge[MAXM];
int head[MAXN],
int n, k, vis[MAXN], ans, root,
void init()
memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head));
e = ans = 0;
void add(int u, int v, int w)
edge[e].v =
edge[e].w =
edge[e].next = head[u];
head[u] = e++;
int mx[MAXN], size[MAXN], mi, dis[MAXN];
void dfssize(int u, int fa) //处理子树的大小
size[u] = 1;
mx[u] = 0;
for(int i = head[u]; i != -1; i = edge[i].next)
int v = edge[i].v;
if(v != fa && !vis[v])
dfssize(v, u);
size[u] += size[v];
if(size[v] & mx[u]) mx[u] = size[v];
void dfsroot(int r, int u, int fa) //求重心
if(size[r] - size[u] & mx[u]) mx[u] = size[r] - size[u];
if(mx[u] & mi) mi = mx[u], root =
for(int i = head[u]; i != -1; i = edge[i].next)
int v = edge[i].v;
if(v != fa && !vis[v]) dfsroot(r, v, u);
void dfsdis(int u, int d, int fa) //求距离
dis[num++] =
for(int i = head[u]; i != -1; i = edge[i].next)
int v = edge[i].v;
if(v != fa && !vis[v]) dfsdis(v, d + edge[i].w, u);
int calc(int u, int d)
int ret = 0;
dfsdis(u, d, 0);
sort(dis, dis + num);
int i = 0, j = num - 1;
while(i & j) //经典
while(dis[i] + dis[j] & k && i & j) j--;
ret += j -
void dfs(int u)
dfssize(u, 0);
dfsroot(u, u, 0);
ans += calc(root, 0);
vis[root] = 1;
for(int i = head[root]; i != -1; i = edge[i].next)
int v = edge[i].v;
if(!vis[v])
ans -= calc(v, edge[i].w);
int main()
while(scanf(&%d%d&, &n, &k) != EOF)
if(!n && !k)
for(int i = 0; i & n - 1; i++)
scanf(&%d%d%d&, &u, &v, &w);
add(u, v, w);
add(v, u, w);
printf(&%d\n&, ans);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:514091次
积分:9570
积分:9570
排名:第1343名
原创:438篇
评论:79条
(1)(2)(11)(3)(6)(6)(13)(35)(11)(17)(7)(1)(71)(4)(18)(55)(26)(12)(22)(25)(19)(28)(3)(16)(2)(27)1741C | Tektronix宜春钽铌矿
您的位置:
【】【】【】
&留言主题:fcYzTesLkytwKN
【】 发表日期: 16:33:46
【留言者】 Buy cialis
Buy cialis说:
&留言主题:EPwgFXUSGQprJxWi
【】 发表日期: 16:33:24
【留言者】 Lwlzqihn
Lwlzqihn说:
comment6, ,
&留言主题:viagra vs levitra vs cialis
【】 发表日期: 16:32:53
【留言者】 zvuvmoqb
zvuvmoqb说:
&留言主题:list of generic viagra products
【】 发表日期: 16:32:45
【留言者】 oftzwhpp
oftzwhpp说:
共28544条&共有页
宜春钽铌矿版权所有 您是第
宜春市电信分公司增值业务部 技术支持

我要回帖

更多关于 mc1741 的文章

 

随机推荐