http://oj.changjun.com.cn/problem/detail/pid/2226

Description

圣诞节到了,FireDancer准备做一棵大圣诞树。下图为圣诞树的一个简单结构。
这棵树被表示成一组被编号的结点和一些边的集合。结点从1到n编号。树的根永远是1。每个结点都有一个自身特有的数值,称为它的重。各个结点的重可能不同。对于一棵做完的树来说,每条边都有一个价值,若设这条边e连接结点i和结点j,且i为j的父结点(根是最老的祖先),则该边的价值为(j的所有子孙及它自己的重之和)*(e的单位价值ce)。
现在FireDancer想造一棵树,使得树上所有边的总价值最小,并且所有的点都在树上,因为FireDancer喜欢大树。

Input

第一行两个整数n和m(0<=n,m<=50000),表示结点总数和可供选择的边数。
下面一行有n个整数,依次表示每个结点的重。
下面m行,每行有3个正整数a,b,c,表示结点a和结点b之间有一个单位价值为c的边可供你造树时选择。
输入中的所有数都小于2^16。

Output

若无解,输出“No Answer”,否则一个整数表示造树的最小价值。

Sample Input

[样例输入1]
2 1
1 1
1 2 15
[样例输入2]
7 7
200 10 20 30 40 50 60
1 2 1
2 3 3
2 4 2
3 5 4
3 7 2
3 6 3
1 5 9

Sample Output

[样例输出1]
15
[样例输出2]
1210

题解

观察发现得到的最大圣诞树所有边的价值总和最小恰好等于根节点到其余各节点的最短路径乘以每个节点的重之和。最后边的价值总和中对于圣诞树中某个节点它的重会乘以什么东西呢?很显然恰好乘的是根节点到该节点的最短路径。因此就是求出每个节点到根节点的最短距离,问题迎刃而解。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxsize=50000;
const long long inf=2147483647;
const int maxE=100;
class edge
{public:int k;short int e[maxE];short int w[maxE];edge(){k=0;}
};
int n,m;
short int node[maxsize]={0};
bool ok[maxsize]={0};
int dist[maxsize]={0};
edge E[25000];
long long sum;
int main()
{int i,j,k;int x,y;int Node;//inputcin>>n>>m;for (i=1;i<=n;i++)cin>>node[i];for (i=1;i<=m;i++){cin>>x>>y;E[x].k++;E[x].e[E[x].k]=y;cin>>E[x].w[E[x].k];E[y].k++;E[y].e[E[y].k]=x;E[y].w[E[y].k]=E[x].w[E[x].k];}//用结构体储存内容for (i=1;i<=n;i++)dist[i]=inf;//dis值赋初值dist[1]=0;for (i=1;i<=n;i++){k=inf;for (j=1;j<=n;j++){        if ((dist[j]<k)&&(ok[j]==0)){k=dist[j];Node=j;}}ok[Node]=1;for (j=1;j<=E[Node].k;j++)if (ok[E[Node].e[j]]==0){x=E[Node].e[j];if (dist[Node]+E[Node].w[j]<dist[x]){dist[x]=dist[Node]+E[Node].w[j];}}}//迪杰斯特拉算法sum=0;for (i=1;i<=n;i++)sum=sum+dist[i]*node[i];cout<<sum<<endl;//计算和输出return 0;
}//借鉴萝卜代码,自己的找不到了。感谢萝卜songyuchen0001

【CJOJ P2226】[省常中2011S4] 圣诞节相关推荐

  1. cogs 1075. [省常中2011S4] 最短路径问题

    1075. [省常中2011S4] 最短路径问题 ★   输入文件:short.in   输出文件:short.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 平面上 ...

  2. 【20160612-20160618】记一周省常中训练(持续更新,欢迎催更)

    挖坑,持续更新. #include <cstdio> using namespace std; int main(){puts("转载请注明出处:http://www.cnblo ...

  3. HGOI20190808 省常中互测1

    Problem A  sum 给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和. 即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 ...

  4. JZOJ 3947 . 【省常中JSOI模拟】收历史作业

    Description 小W 回到了教室,可怜的他要收历史作业,但是0901 班这群不负责任的组长把作业收得乱七八糟,散得每个座位上都有作业本,小W 只好挨个去收. 0901 班的教室可以看作是一个n ...

  5. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  6. HGOI20190811 省常中互测4

    Problem A magic 给出一个字符串$S$,和数字$n$,要求构造长度为$n$只含有小写字母的字符串$T$, 使得在$T$中存在删除且仅删除一个子串使得$S=T$成立. 输出$T$的构造方案 ...

  7. 省常中集训Day2 2022.8.4

    T1.颠倒原理 题目大意:对于一个无向连通图G,有n点m边,初始每个点都为白色,可以选择边进行染色,如果点为白色就染黑,为黑色就染白,如果这个图每个点都可以染黑,那么输出Yes,并输出所需要的边,不漏 ...

  8. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  9. 省常中模拟 day2

    第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...

最新文章

  1. monty python-Monty Python
  2. SpringMvc+AngularJS通过CORS实现跨域方案
  3. python中对比数组长度_在Python中检索数组长度的首选方法
  4. 红米note3支持html,【小米红米Note3评测】外观变化不小 金色版略显俗套_小米 红米Note3_手机评测-中关村在线...
  5. PHP 练习(新闻发布)
  6. 新时代ITer们的思考及购书有奖活动
  7. Devexpress GridView 提交焦点列
  8. Pandas sample随机抽样
  9. 乘大潮而崛起,浪潮云洲大有可为
  10. Laravel 生成QRCODE
  11. 微信小程序检测版本是否有更新
  12. 2048总结 python_2048游戏的python实现
  13. C语言中文网的资源的使用——链接索引
  14. while(i--)
  15. python爬虫笔记五:汽车之家贴吧信息(字体反爬-动态映射)
  16. 向武 清华大学 计算机,哥哥保送弟弟全市第二 双胞胎同时上清华(组图)
  17. 程序员如何阅读英文资料
  18. 计算机工程专业院校排名,2017美国计算机工程专业院校排名
  19. python中的map什么意思啊_python中的map怎么使用(方法详解)
  20. Rails Commands

热门文章

  1. 亲手实践图片木马之捆绑工具(BD2.Net Injector By BD2)
  2. Kaggle实战——点击率预估
  3. 制作CHM - W3School.chm
  4. allergro音乐术语什么意思_乐谱中Allegro Moderato是什么速度?
  5. 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑的键盘灯怎么开
  6. PMP项目的2个商业价值属性是什么?
  7. 效率源希捷7200.10硬盘F级修复教程
  8. 必做作业2:视频剪辑软件调研
  9. 一个简单的Chrome浏览器“清理缓存”插件应用开发
  10. MSP430vsSTM32,你会选择哪个进行项目开发?