COGS 2095. 不平凡的引线
2095. 不平凡的引线
★☆ 输入文件:firelead.in 输出文件:firelead.out 简单对比
时间限制:1 s
内存限制:256 MB
【题目描述】
这里说的引线是炮仗的引线,它可以匀速的燃烧。熊孩子经常会把引线抽出,点引线玩。但是有些熊孩子看到这些并不满足,于是他们把引线的形状摆成一棵树。同时点燃所有的叶子结点,多少单位时间后引线才能燃烧完?可以认为每个单位时间会燃烧一个单位长度的引线。

如上图共有3条引线,其中(1,2)引线的单位长度为2,(2,3)引线单位长度为1,(2,4)引线单位长度为1。现在同时点燃所有叶子结点(叶子结点
定义为只与一条边相邻的结点,如上图中的叶子结点为1,3,4)。1个单位时间以后,(2,3),(2,4)被完全烧完,(1,2)仅剩一半。这时剩下的
半段(1,2)两头均被引燃,所以再过0.5个单位时间后,(1,2)被完全烧完。共需1.5个单位时间。
【输入格式】
第一行一个整数m,表示共有m条引线。
接下来m行,每行三个整数u,v,len表示有一条引线两端分别是u和v,其长度为len
【输出格式】
一个浮点数,表示需要多少单位时间引线会燃烧完,保留一位小数。
【样例输入】
3
1 2 2
2 3 1
2 4 1
【样例输出】
1.5
【提示】
数据范围与约定:
对于30%的数据:m+1 <= 100,保证引线长度均为1
对于60%的数据:m+1 <= 1000,保证引线长度均为1
对于100%的数据:m+1 <= 100000,保证输入的引线一定可以构成一棵树,引线的长度len满足1 <= len <= 10000。
m条边的节点标号范围从1到m+1
题解:
这个题目真的妙不可言,考试的时候只想到模拟。
好了,这个题目求每条边被烧到的时间非常困难,直接求是n平方的,所以我们考虑先求出每个点被烧到的时间,显然是当前节点到所有节点的最短路,这个取min,这个东西可以一次spfa求出来,只要把所有的点事先加如队列之中求出来的就是i这个节点到每个叶子节点的最短路(取min,并且对于图也一样)。
然后求出来点的,就可以推公式求边的了,显然答案就是所有条边被烧完的时间取max,然后考虑怎么推,当dis[to]=dis[now]+quan时(now和to是边上的两个节点,权值是边权),时间=dis[now]+quan=(dis[now]+dis[to]+quan)/2;当dis[to]<dis[now]+quan时(令dis[to]>dis[now]),时间=dis[now]+dis[to]-dis[now]+(quan-(dis[to]-dis[now]))/2=(dis[now]+dis[to]+quan)/2。(因为我们是用多源最短路求的dis,所以不存在dis[now]>dis[to]+quan)把公式带进去就可以了。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#define MAXN 200100
using namespace std;
struct edge{
int first;
int next;
int to;
int quan;
}a[MAXN*];
int in[MAXN];
double dis[MAXN];
bool have[MAXN];
int m,num=,n;
queue<int> q; void addedge(int from,int to,int quan){
a[++num].to=to;
a[num].quan=quan;
a[num].next=a[from].first;
a[from].first=num;
} void spfa(){
while(!q.empty()) q.pop();
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++){
if(in[i]==){
dis[i]=,q.push(i),have[i]=;
}
}
while(!q.empty()){
int now=q.front();
q.pop();have[now]=;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to,quan=a[i].quan;
if(dis[to]>dis[now]+quan){
dis[to]=dis[now]+quan;
if(!have[to]){
have[to]=;
q.push(to);
}
}
}
}
} int main()
{
scanf("%d",&m);n=m+;
for(int i=;i<=m;i++){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
in[x]++;in[y]++;
}
spfa();
double ans=;
for(int now=;now<=n;now++){
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to,quan=a[i].quan;
double x=(dis[now]+dis[to]+quan)/2.0;
ans=max(ans,x);
}
}
printf("%0.1f",ans);
return ;
}
COGS 2095. 不平凡的引线的更多相关文章
- COGS 2096. 不平凡的许愿树
[题目描述] noip要到了,大家来到许愿树前.这个许愿树不仅仅是许愿树,还有未卜先知的功能.众OIer问许愿树:“不平凡的许愿树,CCF告诉我们noip中会有两道题目从Openjudge上选择,你能 ...
- [COGS 2089.] 平凡的测试数据 带权并查集
差点就撸上LCT了....... 带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现. #include<cstdio> #define N 300010 us ...
- COGS 2089. 平凡的测试数据
[题目描述] 树链剖分可以干什么? “可以支持在树中快速修改一个点信息,快速询问一条链信息” LCT可以干什么? “可以支持树链剖分支持的特性,并且支持快速链接两个棵树,或者断开某条边” 那我现在要出 ...
- (原创)古典主义——平凡之美 佳作欣赏(摄影,欣赏)
文中图片摘自腾讯文化网:www.cal.qq.com 1.Abstract 生活本就是平淡的,如同真理一般寂静.平时生活中不经意的瞬间,也有它本来的美丽.下面一组图是上上个世纪到上个世纪末一个 ...
- PHP内核探索之变量(7)- 不平凡的字符串
切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1) 在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...
- 【COGS 254】【POI 2001】交通网络图
http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...
- 【COGS】894. 追查坏牛奶
http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...
- Python的平凡之路(8)
(本文是对平凡之路(7)的补充等) 一.动态导入模块 import importlib __import__('import_lib.metaclass') #这是解释器自己内部用的 #importl ...
- HDOJ 2095
find your present (2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/1024 K (Java/Oth ...
随机推荐
- Java内部类的使用小结 形参为什么要用final
部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文 ...
- 【Linux】一些常用命令(待整理)
一.关机重启命令 二.查询ip 三.查询杀死进程 四.CentOS7 关闭防火墙 五.vim常用 5.1 搜索 5.2 设置行号 剪切 替换 一.关机重启命令 shutdown -h 10 #计算机将 ...
- Fortify安全漏洞一般处理方法
前段时间公司又一轮安全审查,要求对各项目进行安全扫描,排查漏洞并修复,手上有几个历史项目,要求在限定的时间内全部修复并提交安全报告,也不清楚之前是如何做的漏洞修复,这次使用工具扫描出来平均每个项目都还 ...
- FreeSql (三十)读写分离
FreeSql 支持数据库读写分离,本功能是客户端的读写分离行为,数据库服务器该怎么配置仍然那样配置,不受本功能影响,为了方便描术后面讲到的[读写分离]都是指客户端的功能支持. 各种数据库的读写方案不 ...
- Tomcat运行机制
Tomcat其实就是一个servlet的容器,因此,它在运行过程中,首先要做以下事情: 1.实现servlet api规范.如request.response.cookie.session等,容器对其 ...
- spring-boot集成spark并使用spark-sql
首先添加相关依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- python9
v> 软件测试 广州博才科技开发有限公司 迅捷PDF编辑器 3.5 集合 学习目标: 1. 能够说出如何创建集合 2. 能够说出字典和集合的区别 3. 能够说出如何向集合中添加元素 4. 能够说 ...
- kafka报错:Invalid message size: 0
现象 1.kafka topic 部分分区积压 2.问题kafka 节点上一直报错:java.lang.IllegalStateException: Invalid message size: 0 [ ...
- 前端面试题——html与css基础篇
整理一波html和css的面试题,侧重基础,希望明天面试能用到~(╥╯^╰╥) 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.C ...
- JAVA线程基础概念及使用
一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...