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. 不平凡的引线的更多相关文章

  1. COGS 2096. 不平凡的许愿树

    [题目描述] noip要到了,大家来到许愿树前.这个许愿树不仅仅是许愿树,还有未卜先知的功能.众OIer问许愿树:“不平凡的许愿树,CCF告诉我们noip中会有两道题目从Openjudge上选择,你能 ...

  2. [COGS 2089.] 平凡的测试数据 带权并查集

    差点就撸上LCT了....... 带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现. #include<cstdio> #define N 300010 us ...

  3. COGS 2089. 平凡的测试数据

    [题目描述] 树链剖分可以干什么? “可以支持在树中快速修改一个点信息,快速询问一条链信息” LCT可以干什么? “可以支持树链剖分支持的特性,并且支持快速链接两个棵树,或者断开某条边” 那我现在要出 ...

  4. (原创)古典主义——平凡之美 佳作欣赏(摄影,欣赏)

    文中图片摘自腾讯文化网:www.cal.qq.com 1.Abstract     生活本就是平淡的,如同真理一般寂静.平时生活中不经意的瞬间,也有它本来的美丽.下面一组图是上上个世纪到上个世纪末一个 ...

  5. PHP内核探索之变量(7)- 不平凡的字符串

    切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1)       在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...

  6. 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...

  7. 【COGS】894. 追查坏牛奶

    http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...

  8. Python的平凡之路(8)

    (本文是对平凡之路(7)的补充等) 一.动态导入模块 import importlib __import__('import_lib.metaclass') #这是解释器自己内部用的 #importl ...

  9. HDOJ 2095

    find your present (2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/1024 K (Java/Oth ...

随机推荐

  1. 【Offer】[63] 【股票的最大利润】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 例如,一只股票在某些时间节点的价格为{9, ...

  2. Netty源码分析 (六)----- 客户端连接接入accept过程

    通读本文,你会了解到1.netty如何接受新的请求2.netty如何给新请求分配reactor线程3.netty如何给每个新连接增加ChannelHandler netty中的reactor线程 ne ...

  3. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

  4. Go语言标准库之flag

    Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...

  5. Java基础语法(总结篇)

    关键字&标识符 关键字的概念与特征 概念:Java关键字是事先定义好的对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名和 ...

  6. HTML制作WORD表格

    效果图 table属性 align:让内容居中,取值为left.right.center border:设置表格的边框 cellspacing:单元格与单元格之间的距离 bgcolor:表格的背景色 ...

  7. SpringCloud入门[转]

    原文链接 一.  网站的架构演变    网络架构由最开始的三层mvc渐渐演变.传统的三层架构后来在互联网公司让几百人几千人同时开发一个项目已经变得不可行,并且会产生代码冲突的问题.基于SOA面向服务开 ...

  8. 【学习笔记】第二章 python安全编程基础---正则表达式

    一.python正则表达式 定义:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式相匹配: 1.1RE模块:是python语言拥有全部的正则表达式功能的一个正则模块: 常见 ...

  9. 一文读懂NodeJS全栈开发利器:CabloyJS(万字长文)

    目录 0 修订 0.1 修订说明 0.2 修订历史 1 基本概念 1.1 CabloyJS是什么 1.2 CabloyJS核心解决什么问题 1.3 CabloyJS的开发历程 2 数据版本与开发流程 ...

  10. jmeter linux分布式压测Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is: java.io.FileNotFoundException: rmi_keystore.jks

    在路径\apache-jmeter-5.0\bin下启动jmeter-server.bat时抛出了如下异常: 1.jmeter 1099端口 被占用,修改端口号 使用netstat -lntp|gre ...