【CJOJ P2226】[省常中2011S4] 圣诞节
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;
//input
cin>>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] 圣诞节的更多相关文章
- cogs 1075. [省常中2011S4] 最短路径问题
1075. [省常中2011S4] 最短路径问题 ★ 输入文件:short.in 输出文件:short.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 平面上 ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- 省常中模拟 Test2 Day2
two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...
- 省常中模拟 Test4
prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...
- 省常中模拟 Test3 Day1
tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- HGOI 20190816 省常中互测8
Problem A 有两条以(0,0)为端点,分别经过(a,b),(c,d)的射线,你要求出夹在两条射线中间,且距离(0,0)最近的点(x,y) 对于$100\%$的数据满足$1 \leq T \l ...
- HGOI20190814 省常中互测7
Problem A 中间值 对于$2$个非严格单增序列$\{A_n\} , \{B_n\}$,维护下列两个操作: 1 x y z: (x=0)时将$A_y = z$ , (x=1)时将$B_y = z ...
随机推荐
- php + 和 array_merge的区别
(1)对于+,当key相同时,都是舍弃后面的结果: array_merge ,当key相同时,key是字符,则后面的覆盖前面的:key是数字,则不发生覆盖,会重新建立数组索引. $arr1 = arr ...
- CSS预处理器之Less详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. CSS 预处理器 为什么要有 CSS 预处理器 CSS基本上是设计师的工 ...
- C/C++语言简介之关键字
关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字.例如关键字不能用作变量名.函数名等标识符.由ISO标准定义的C语言关键字共32个:auto.double.int.struct.br ...
- 避免Toast重复弹出
Toast.matkText才会创建一个新的实例 private Toast toast = null; private void checkToastResult() { if (toast != ...
- 《android开发艺术探索》读书笔记(十二)--Bitmap的加载和Cache
接上篇<android开发艺术探索>读书笔记(十一)--Android的线程和线程池 No1: 目前比较常用的缓存策略是LruCache和DiskLruCache,LruCache常被用作 ...
- LOJ6277~6285 数列分块入门
Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...
- linux中的三个文件时间
Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time). 后来为了解决atime的性能问题, ...
- Flask Ansible自动化平台搭建(持续更新)
一:简介 使用Ansible + Flask + Celery搭建web平台. 目录结构 . ├── ansible_api │ ├── ansible_playbook_inventory.py ...
- MySQL之pymysql模块
MySQL之pymysql模块 import pymysql #s链接数据库 conn = pymysql.connect( host = '127.0.0.1', #被连接数据库的ip地址 po ...
- 故障定位之查找附近点GeoHash研讨
随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标:查找附近的XXX ...