`
darren_nizna
  • 浏览: 72779 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[PKU/POJ][1741][Tree][树的分治]

 
阅读更多

LTC 男人八题之一,解题报告见09看论文。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int const N= 10010, inf= 0x7fffffff;
int n, k, cnt, tot, root, size, nchild, first, last, pre, ans;
int Fnum;

struct Edge{
	int adj, wt;
	Edge* next;
}tb[N<<1];

Edge* mat[N];
int dist[N], flag[N], que[N], vis[N], num[N];

void inline add( int u, int v, int d ){
	++cnt;
	tb[cnt].adj= v; tb[cnt].wt= d;
	tb[cnt].next= mat[u]; mat[u]= tb+ cnt;
	
	++cnt;
	tb[cnt].adj= u; tb[cnt].wt= d;
	tb[cnt].next= mat[v]; mat[v]= tb+ cnt;
}

int selectRoot( int rt ){
	flag[rt]= Fnum;
	
	int tmp= 0, sum= 0;
	for( Edge* p= mat[rt]; p; p= p->next ){
		int v= p->adj;
		
		if( vis[v]== 0 && flag[v]!= Fnum ){
			int s= selectRoot( v );
			
			if( s> tmp ) tmp= s;
			sum+= s;
		}
	}
	
	if( nchild- 1- sum> tmp ) tmp= nchild- 1- sum;
	
	if( tmp< size ){  size= tmp; root= rt; }
	
	return sum+ 1;
}

int inline getCount( int first, int last ){
	sort( dist+ first, dist+ last+ 1 );
	
	int head= first, tail= last, ret= 0;
	while( first< last ){
		if( dist[first]+ dist[last]<= k ) ret+= last- first++; 
		else last--;
	}
	return ret;
}

int dfs( int rt, int len ){
	flag[rt]= Fnum; dist[++last]= len;
	
	int sum= 0;
	for( Edge* p= mat[rt]; p; p= p->next )
	if( !vis[p->adj] && flag[p->adj]!= Fnum ){
		int v= p->adj, wt= p->wt;
		
		sum+= dfs( v, len+ wt );
	}
	
	num[rt]= sum+ 1;
	return sum+ 1;
}

void solve( int rt ){
	pre= 1;
	for( Edge* p= mat[rt]; p; p= p->next )
	if( !vis[p->adj] && flag[p->adj]!= Fnum ){
		int v= p->adj, wt= p->wt;
		
		dfs( v, wt );
		ans-= getCount( pre, last );

		pre= last+ 1;
	}
}

int main(){
	while( scanf("%d%d",&n,&k)!= EOF ){
		if( n== 0 && k== 0 ) return 0;
		
		for( int i= 0; i<= n; ++i ) mat[i]= 0, flag[i]= 0, vis[i]= 0;
		cnt= -1; tot= -1;
		
		int u, v, d;
		for( int i= 1; i< n; ++i ){
			scanf("%d%d%d", &u,&v,&d );
			
			add( u, v, d );
		}
		
		int head= 0, tail= 0; que[0]= 1; 
		nchild= n; ans= 0; Fnum= 0; num[1]= n;
		
		while( head<= tail ){
			int now= que[head++]; nchild= num[now]; Fnum++;
			
			size= 0x7fffffff; selectRoot( now ); vis[root]= 1;		
			
			for( Edge*p= mat[root]; p; p= p->next )
			if( !vis[p->adj] ) que[++tail]= p->adj;
			
			first= pre= 1; last= 0; Fnum++;
	
			solve( root ); dist[++last]= 0;
			ans+= getCount( first, last );
		}
		
		printf("%d\n", ans );
	}
	
	return 0;
}

 

0
1
分享到:
评论

相关推荐

    PKU 、POJ ACM/ICPC300多题的代码

    标题“PKU 、POJ ACM/ICPC300多题的代码”指的是北京大学(PKU)和编程在线评测平台POJ上收集的300多道ACM/ICPC(国际大学生程序设计竞赛)比赛题目解题代码。这个压缩包包含了解决这些竞赛问题的算法和程序实现,是...

    PKU_poj 1197

    ACM PKU_poj 1197 仓库问题源代码,愿与大家共享。若谁更好的代码,多谢提供。

    PKU_poj 1001~1009

    标题“PKU_poj 1001~1009”揭示了这是一组与北京大学(Peking University)编程竞赛平台POJ相关的解决方案。在这个压缩包中,包含了从问题1001到1009的C++源代码,表明这些代码已经过验证并成功解决了对应的算法问题。...

    POJ动态规划题目全面总结

    PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中经常会遇到的算法。这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,...

    pku(poj)--2494--Acid Text--java代码

    根据给定的文件信息,我们可以总结出以下关于POJ(PKU)问题2494“Acid Text”以及其Java代码实现的关键知识点: ### 1. POJ(PKU)2494:Acid Text POJ(Peking University Online Judge)是北京大学的一个在线...

    pku_poj_2187.rar_poj 2187_凸包问题

    标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...

    pku1088.rar_pku 10_pku 1088_poj 1088

    标题中的“pku1088.rar_pku 10_pku 1088_poj 1088”指的是北京大学(Peking University, PKU)编程竞赛中的第1088题,也称为POJ(Peking University Online Judge)的1088题。这个题目在编程竞赛社区中通常有一个特定的...

    pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11

    标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...

    poj 130题 acm pku

    【标题】"poj 130题 acm pku" 涉及的是ACM(国际大学生程序设计竞赛)中的PKU(北京大学)在线判题系统POJ(Problem Online Judge)的相关题目。ACM/ICPC(International Collegiate Programming Contest)是全球...

    poj3252.rar_pku 3252_poj32

    标题中的"poj3252.rar_pku 3252_poj32"表明这是一个与编程竞赛相关的资源,具体来说是北京大学(PKU)ACM竞赛中的问题3252。"poj"通常指的是"Programming Online Judge",这是一个在线编程比赛平台,而"Pku"则代表...

    pku 2054 color a tree 解题报告

    题目“2054-Color a Tree”是一个典型的树形结构优化问题,要求找到一种颜色节点的顺序,使得总成本最小。在这个问题中,每个节点都有一个“着色成本系数”Ci,节点i的着色成本是Ci乘以其被着色的时间Fi。时间在开始...

    poj(PKU-2314-POJ language

    根据提供的文件信息,我们可以分析出该段代码是用于解决POJ平台上的2314题的一种解决方案,主要涉及到了变量管理、表达式处理等方面。下面将详细解释代码中的关键概念和实现逻辑。 ### 关键概念解析 #### Variable...

    PKU POJ 1162 Building with Blocks解题报告

    ### PKU POJ 1162 Building with Blocks 解题报告 #### 题目概述 本题名为“Building with Blocks”,属于经典的积木搭建问题。题目要求利用一定数量的基本单位积木,搭建出特定的三维形状。积木的种类不超过12种,...

    北大oj题集(清晰版,poj上原题集)

    “北京大学程序在线评测系统”是一个免费的公益性网上程序设计题库,网址为http://poj.grids.cn/ 及 http://acm.pku.edu.cn/JudgeOnline,它包含2000多道饶有趣味的程序设计题,题目大部分来自ACM国际大学生程序设计...

    pku 123 题目代码

    标题 "pku 123 题目代码" 暗示了这是一个与北京大学(Peking University)编程竞赛(PKU ACM/ICPC)相关的代码集合,可能包含了参赛者为解决PKU ACM在线判题系统(PJU POJ)上的123道题目所编写的程序。POJ是北京大学维护...

    poj pku图论、网络流入门题总结、汇总

    根据提供的标题“poj pku图论、网络流入门题总结、汇总”及描述“很经典的图论,网络流入门的题目,值得一看啊~~其中有简单的解析”,本篇将对这些经典图论与网络流问题进行详细的分析和总结。通过梳理各题目及其...

    POJ 部分题解 解题报告

    这些文件名揭示了若干个在编程竞赛中常见的算法和数据结构问题,主要集中在POJ(Programming Online Judge)和PKU(Peking University)的在线评测系统上。下面将逐一解析这些题目并介绍相关的编程知识点: 1. **...

    POJ.rar_pku ac_pku.1050

    标题中的"POJ.rar_pku ac_pku.1050"暗示了这是一个与北京大学(Peking University, 简称PKU)编程竞赛相关的压缩文件,其中包含了作者通过验证(Passed All Cases, 简称AC)的代码,具体是针对PKU题目编号1050的问题。...

    pku poj 2406

    #include using namespace std; #define M 1000000 char t[M+1],p[M+1]; int lent,lenp; bool kmp(char *t,char *p) { int i,j; for(i=lenp,j=0;i;i++) { if(t[i]!=p[j]) return false;...}

    ACM POJ PKU 最全题目分类

    ### ACM POJ PKU 最全题目分类解析 #### 动态规划(DP) 在计算机科学领域,动态规划(Dynamic Programming, DP)是一种重要的算法思想,主要用于解决多阶段决策过程中的优化问题。它通过将原问题分解成相互重叠的...

Global site tag (gtag.js) - Google Analytics