树分治 poj 1741
n k
n个节点的一棵树 k是距离
求树上有几对点距离<=k;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector> using namespace std;
#define MAXN 100100 int head[MAXN];
bool vis[MAXN];
struct edg
{
int to,next,w;
}x[MAXN];
int cnt,ans,n,k,root;
int mi,num;
int mx[MAXN],size[MAXN],dis[MAXN]; //分别 是去掉这个点的子树最大节点数 以这个节点为根的子树包括的节点树(包括自己) 就一个存距离的数组 void add(int u,int v,int w)
{
x[cnt].next=head[u];
x[cnt].w=w;
x[cnt].to=v;
head[u]=cnt++;
}
void dfssize(int u,int fa) //树DP差不多 包括的节点
{
size[u]=;
mx[u]=;
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
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=u;
}
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
if(v!=fa&&!vis[v])
dfsroot(r,v,u);
}
}
void dfsdis(int u,int d,int fa)//存一下距离
{
dis[num++]=d;
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
if(v!=fa&&!vis[v])
dfsdis(v,d+x[i].w,u);
}
}
int calc(int u,int d)
{
int ret=;
num=;
dfsdis(u,d,);
sort(dis,dis+num);
int i=,j=num-;
while(i<j) //自己模拟一下 算出有多少对
{
while(dis[i]+dis[j]>k&&i<j)
j--;
ret+=j-i;
i++;
}
return ret;
}
void dfs(int u)
{
mi=n;
dfssize(u,);
dfsroot(u,u,);
ans+=calc(root,); //这边算出来的还要减去 在它的一颗子树中(2个节点)如果满足 上面条件 其实并没什么用 但是多算了
vis[root]=;
for(int i=head[root];i!=-;i=x[i].next)
{
int v=x[i].to;
if(!vis[v])
{
ans-=calc(v,x[i].w); //所以这边要减掉
dfs(v);
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==k&&k==)
break;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
ans=cnt=;
for(int i=;i<n;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
}
dfs();
printf("%d\n",ans);
}
return ;
}
树分治 poj 1741的更多相关文章
- 点分治——POJ 1741
写的第一道点分治的题目,权当认识点分治了. 点分治,就是对每条过某个点的路径进行考虑,若路径不经过此点,则可以对其子树进行考虑. 具体可以看menci的blog:点分治 来看一道例题:POJ 1741 ...
- 树上点分治 poj 1741
Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v ...
- poj 1741 树的点分治(入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18205 Accepted: 5951 Description ...
- POJ 1741.Tree 树分治 树形dp 树上点对
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 24258 Accepted: 8062 Description ...
- POJ 1741 树分治
题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...
- poj 1741 Tree(树的点分治)
poj 1741 Tree(树的点分治) 给出一个n个结点的树和一个整数k,问有多少个距离不超过k的点对. 首先对于一个树中的点对,要么经过根结点,要么不经过.所以我们可以把经过根节点的符合点对统计出 ...
- POJ 1741 Tree【树分治】
第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了.. 以后做题中再慢慢体会学习. 题目链接: http://poj.org/problem?id=1741 题意: 给定树和树边的权重 ...
- poj 1741 楼教主男人八题之中的一个:树分治
http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...
- 【POJ 1741】 Tree (树的点分治)
Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 100 ...
随机推荐
- [tem]高精度2
从1开始 ; ; struct big{ int size,d[L]; big():size(a){memset(d,,sizeof(int)*L);} }; void jia(big &a, ...
- URL和URI的区别和联系
URI:Universal Resource Identifier,通用资源标识符: URL:Uniform Resource Locator,统一资源定位符: 其中,URL ...
- memcache的安装和使用
Memcache Memcached是一个高性能的分布式缓存系统.memcached自身不会实现分布式,分布式是由程序来实现的. Memcached一旦安装之后,自身进行管理!预申请一个很大的内存空间 ...
- CycleRotationView:自定义控件之轮播图
CycleRotationView:自定义控件,主要功能是实现类似与各种商城首页的广告轮播图.其实像这种比较常见的自定义控件早就满大街了,虽然说"不要重复发明轮子",但是不代表不用 ...
- DataTable详解,以及dataview
原文地址:http://www.cnblogs.com/moss_tan_jun/archive/2010/09/20/1832131.html 得到DataTable 得到DataTable有许多方 ...
- HTML 学习笔记 CSS3 (多列)
CSS3多列 通过CSS3 我们能够创建多个列来对文本进行布局. 在这篇文章中 你将了解到如下多列属性: column-count column-gap column-rule 浏览器支持: 多列的属 ...
- usb驱动开发13之设备生命线
上一节勉勉强强把struct urb这个中心给说完,接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/ ...
- Web Api其中的PUT功能演示
Insus.NET这几天均在学习Web API知识,并练习.怎样获取数据,提交数据或是保存数据.你可以温习一下<Post model至Web Api创建或是保存数据>http://www. ...
- windows 10
http://auPL.v4.b1.download.windowsupdate.com/c/updt/2015/07/10240.16384.150709-1700.th1_clientchina_ ...
- Linux 网络编程详解七(并发僵尸进程处理)
在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导 ...