这题也太水了吧,为什么不是我这届的NOI(╯‵□′)╯︵┻━┻

原题:

在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路。
每条道路的修建都要付出一定的费用,这个费用等于道路长度乘以道路两端 的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4 个国家,如果该道路长度为 1,则费用为 1×|2 – 4|=2。图中圆圈里的数字表示国 家的编号。

由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建
费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计 算出所需要的费用。请你帮助国王们设计一个这样的软件

n<=1000000,ci<=1000000

刚开始看错题了,以为是给出任意两个国家的距离,然后求生成树……

但是树直接给出来了,直接求值即可不用维护最优值,就是个模拟么……

所以这道题应该算是树形递推而不是树归

先随便挑一个点搞树,稍加观察即可发现每个点和它爹之间连的边的权值就是|n-size[x]-size[x]|*value[x](value[x]表示x和爹之间连边的长度)

然后就是求size

数据很大所以dfs会炸掉(Linux或者手动开栈不会炸?),所以使用bfs

先dfs一遍,把树建起来,然后倒着把队列遍历一遍,因为bfs是一层一层推得,所以反遍历队列就保证先到儿子,在到爹,然后就可以更新了

最后从2-n根据上面的公式↑求值累加即可(我把根节点设为1,根节点不用更新因为根节点没爹)

注意会炸int,如果乘法运算的结果会炸int的话乘的两个数必须至少有一个是longlong,这里把求绝对值函数的返回值设为longlong是一个不错的选择

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
inline long long jue(long long x,long long y){return (x>y)?x-y:y-x;}//注意绝对值也要longlong
struct ddd{int next,y,value;}e[];int LINK[],ltop=;
inline void insert(int x,int y,int z){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].value=z;}
struct dcd{int child,brother,father,value,size;}tree[];
inline void insert_tree(int x,int y,int z){tree[y].brother=tree[x].child;tree[x].child=y;tree[y].father=x;tree[y].value=z;}
int n;
int dui[],tou=;
void get_tree(){
dui[tou=]=; tree[].father=tree[].value=;
for(int k=;k<=tou;k++)
for(int i=LINK[dui[k]];i;i=e[i].next)if(e[i].y!=tree[dui[k]].father){
insert_tree(dui[k],e[i].y,e[i].value);
dui[++tou]=e[i].y;
}
for(int k=tou;k>=;k--){
tree[dui[k]].size=;
for(int i=LINK[dui[k]];i;i=e[i].next)if(e[i].y!=tree[dui[k]].father)
tree[dui[k]].size+=tree[e[i].y].size;
}
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n;
int _left,_right,_value;
for(int i=;i<n;i++){
_left=read(); _right=read(); _value=read();
insert(_left,_right,_value); insert(_right,_left,_value);
}
get_tree();
long long ans=;
for(int i=;i<=n;i++) ans+=jue(n-tree[i].size,tree[i].size)*tree[i].value;
cout<<ans<<endl;
return ;
}

【NOI2011】【P1308】道路修建的更多相关文章

  1. 【NOI2011】道路修建 BFS

    [NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...

  2. 【BZOJ】【2435】【NOI2011】道路修建

    DFS/DP 本来以为是一道傻逼题,然而跪了好久……一直RE…… 直接dfs就好了……x->y val=c  :  ans+=abs(n-size[y]-size[y])*c; 然而为啥会一直R ...

  3. 【LOJ】#2445. 「NOI2011」道路修建

    题解 看完题目我的第一个反应是--要求最小花费的方案?!怎么求??? 然后我把题读完了.好吧. 记录一下size就行,比NOIP普及组还要不如的题= = 代码 #include <iostrea ...

  4. 冲刺NOIP2015提高组复赛模拟试题(五)2.道路修建

    2.道路修建 描述 Description liouzhou_101最悲痛的回忆就是NOI2011的道路修建,当时开了系统堆栈,结果无限RE… 出于某种报复心理,就把那题神奇了一下: 在 Z星球上有N ...

  5. bzoj 2435: [Noi2011]道路修建 树上 dp

    2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  6. NOI2011道路修建

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1974  Solved: 550[Submit][Status ...

  7. BZOJ 2435: [Noi2011]道路修建( dfs )

    NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...

  8. 2435: [Noi2011]道路修建

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2188  Solved: 639[Submit][Status ...

  9. BZOJ_2435_[Noi2011]道路修建_dfs

    BZOJ_2435_[Noi2011]道路修建_dfs 题意: http://www.lydsy.com/JudgeOnline/problem.php?id=2435 分析: dfs搞定. 我怕爆栈 ...

  10. BZOJ 2435: [Noi2011]道路修建 dfs搜图

    2435: [Noi2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他 ...

随机推荐

  1. Quartz之主方法运行

    import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; impo ...

  2. linux内核编译

    1,进入内核源码树,如果是第一次编译,建议清理以下内核功能选择文件: make mrproper 2,删除前一次编译的残留文件: make clean 3,配置内核功能 make menuconfig ...

  3. PC客户端测试总结

    1.1界面显示内容的检查l 完整性(1显示时应考虑数据显示宽度的自适应或自动换行(数据长度较长).(2所数据展现的界面(如查询等),必须使测试数据的记录数超过一页,以验证满页时其窗体是否有横向.纵向滚 ...

  4. OpenCV函数解读之groupRectangles

    不管新版本的CascadeClassifier,还是老版本的HAAR检测函数cvHaarDetectObjects,都使用了groupRectangles函数进行窗口的组合,其函数原型有以下几个: C ...

  5. Cannot change network to bridged: There are no un-bridged host network adapters解决方法

    首先,在你安装上了虚拟机后要确保你也安装了桥接的协议,这可以通过点击右键“网上邻居”,在其中可以看到有两个虚拟出来的网络一个VMnet1,另一个是VMnet8, 如下图所示. 如果没有安装,可以通过下 ...

  6. public protected default private

    简单来说,如果让一个变量或者方法,只想让自己类中的访问,那么就将它们设置成private 如果你想让一个变量或者方法,本包中的类可以访问,而且子类也可访问,但是包外的缺不想让他访问.就设置成prote ...

  7. HDU 4850

    http://acm.hdu.edu.cn/showproblem.php?pid=4850 西安邀请赛当时没做出来的银牌门坎题 题意:构造一个长度n的字符串,长度>=4的子串只能出现一次 题解 ...

  8. 英文VS2010安装中文版MSDN文档方法

    英文VS2010安装中文版MSDN文档方法 2010-06-01 11:52 by 李永京, 51409 阅读, 50 评论, 收藏, 编辑 在2010年4月12号发布Visual Studio 20 ...

  9. iOS开发环境C语言基础 运算符和表达式

    1 年龄判断程序 1.1 问题 本案例需要使用交互的方式判断年龄的范围:用户从控制台输入一个年龄,由程序判断该年龄是否在18~50岁之间.程序交互过程如图-1所示: 图-1 1.2 步骤 实现此案例需 ...

  10. PHP 的snmp各个版本的Wrapper封装类

    原文来自:http://blog.chinaunix.net/uid-7654720-id-3211234.html class SNMP_Wrapper { protected $_host; pr ...