2435: [Noi2011]道路修建
2435: [Noi2011]道路修建
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2188 Solved: 639
[Submit][Status]
Description
在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家
之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿
意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为 1,则费用为1×|2 – 4|=2。图中圆圈里的数字表示国家的编号。
.jpg)
由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建
费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计
算出所需要的费用。请你帮助国王们设计一个这样的软件。
Input
输入的第一行包含一个整数n,表示 W 星球上的国家的数量,国家从 1到n
编号。接下来 n – 1行描述道路建设情况,其中第 i 行包含三个整数ai、bi和ci,表
示第i 条双向道路修建在 ai与bi两个国家之间,长度为ci。
Output
输出一个整数,表示修建所有道路所需要的总费用。
Sample Input
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1
Sample Output
HINT
n = 1,000,000 1≤ai, bi≤n
0 ≤ci≤ 10^6
Source
题解:其实就是个搜索,由于题目中给了一棵树,所以直接建树,然后求出每个点有多少子孙(算自己)。。。本身应该不难的,但是对于P党问题来了——BFS嘛,搞死了还是超时(坑爹的int64运算简直慢到哭);DFS呵呵直接爆栈不解释(对于C++党的linux下系统栈无限表示严重鄙视!!TT传送门 ),于是我还是壮烈的TLE了,求神犇帮助(不过程序算法应该没有问题,就是int64害得......)
BFS:
1 type
2 point=^node;
3 node=record
4 g,w:longint;
5 next:point;
6 end;
7
8 var
9 i,j,k,l,m,n:longint;ll:int64;
a:array[..] of point;
c,b,d,e:array[..] of longint;
p:point;
procedure add(x,y,z:longint);inline;
var
p:point;
begin
new(p);
p^.g:=y;
p^.w:=z;
p^.next:=a[x];
a[x]:=p;
end;
procedure bfs1;inline;
var
p:point;f,r:longint;
begin
b[]:=;d[]:=;
f:=;r:=;
while f<r do
begin
p:=a[d[f]];
while p<>nil do
begin
if b[p^.g]= then
begin
b[d[f]]:=;
b[p^.g]:=;
c[p^.g]:=d[f];
d[r]:=p^.g;
inc(r);
end;
p:=p^.next;
end;
inc(f);
end;
end;
begin
readln(n);
for i:= to n do a[i]:=nil;
for i:= to n- do
begin
readln(j,k,l);
add(j,k,l);
add(k,j,l);
end;
fillchar(b,sizeof(b),);ll:=;
fillchar(c,sizeof(c),);fillchar(d,sizeof(d),);
bfs1;ll:=;
for i:=n downto do
begin
e[d[i]]:=;
p:=a[d[i]];
while p<>nil do
begin
if p^.g<>c[d[i]] then
begin
ll:=ll+int64(abs(e[p^.g]-(n-e[p^.g])))*int64(p^.w);
e[d[i]]:=e[d[i]]+e[p^.g];
end;
p:=p^.next;
end;
end;
writeln(ll);
readln; end.
DFS:
type
point=^node;
node=record
g,w:longint;
next:point;
end; var
i,j,k,l,m,n:longint;ll:int64;
a:array[..] of point;
c,b:array[..] of longint;
procedure add(x,y,z:longint);inline;
var
p:point;
begin
new(p);
p^.g:=y;
p^.w:=z;
p^.next:=a[x];
a[x]:=p;
end;
procedure dfs(x:longint);inline;
var
p:point;
begin
if b[x]= then exit;
p:=a[x];b[x]:=;
while p<>nil do
begin
if b[p^.g]= then
begin
dfs(p^.g);
ll:=ll+int64(int64(abs(int64(c[p^.g])-int64(int64(n)-int64(c[p^.g]))))*int64(p^.w));
c[x]:=c[x]+c[p^.g];
end;
p:=p^.next;
end;
end;
begin
readln(n);
for i:= to n do
begin
c[i]:=;
a[i]:=nil;
end;
for i:= to n- do
begin
readln(j,k,l);
add(j,k,l);
add(k,j,l);
end;
fillchar(b,sizeof(b),);ll:=;
dfs();
writeln(ll);
end.
2435: [Noi2011]道路修建的更多相关文章
- bzoj 2435: [Noi2011]道路修建 树上 dp
2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2435: [Noi2011]道路修建( dfs )
NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...
- BZOJ 2435: [Noi2011]道路修建 dfs搜图
2435: [Noi2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他 ...
- 2435: [Noi2011]道路修建(树上操作)
2435: [Noi2011]道路修建 题目:传送门 题解: 建完边之后以1为根建树,统计深度和各个点的子树大小(包括自己) 询问的时候:答案=长度*abs(n-深度大的点的子树大小*2) ans+= ...
- 【BZOJ】2435: [Noi2011]道路修建(树形dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...
- 2435: [Noi2011]道路修建 - BZOJ
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...
- bzoj 2435: [Noi2011]道路修建
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...
- bzoj 2435: [Noi2011]道路修建【树形dp】
dp求size和deep,然后对每条边模拟求代价即可 #include<iostream> #include<cstdio> #include<algorithm> ...
- NOI2011道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1974 Solved: 550[Submit][Status ...
随机推荐
- 采用FirePHP调试PHP程序
采用FirePHP调试PHP程序 FirePHP是什么? FirePHP是一个利用Firebug console栏输出调试信息方便程序调试.这一切只需要调用几个简单的函数. 他看起来是怎么个样子? 1 ...
- doubango(5)--SIP协议栈传输层的启动
SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...
- MyBatis 源码分析——动态代理
MyBatis框架是如何去执行SQL语句?相信不只是你们,笔者也想要知道是如何进行的.相信有上一章的引导大家都知道SqlSession接口的作用.当然默认情况下还是使用DefaultSqlSessio ...
- W3Cschool学习笔记——HTML基础教程
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- JAVA中的char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- RejectedExecutionException 分析
当往一个固定队列ArrayBlockingQueue 不停的提交任务时,会发生什么? 请看如下代码 private static final int QUEUE_SIZE = 20; private ...
- table中td的宽度不随文字变宽
1.设置了table的宽度后,宽度仍然不固定,td的内容一多,很容易吧table撑变形.有些时候我们需要设置固定的宽度. 解决办法 table的css 加入样式 table-layout:fixed ...
- 使用ViewPagerAdapter 页面引导适配器设置app启动页,引导页面的实现
一般的app第一次安装启动的时候,都会有一个启动页面和引导页的画面,然后才进入主程序.anndroid中的ViewPagerAdapter 是一个继承与PageAdapter的 页面引导适配器.由于我 ...
- ubuntu下包管理器apt-get常用命令
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...
- C#表达式和语句
表达式由操作数 (operand) 和运算符 (operator) 构成.表达式的运算符指示对操作数适用什么样的运算.运算符的示例包括+.-.*./ 和 new.操作数的示例包括文本.字段.局部变量和 ...