P1453 城市环路
题目背景
一座城市,往往会被人们划分为几个区域,例如住宅区、商业区、工业区等等。B市就被分为了以下的两个区域——城市中心和城市郊区。在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心。
题目描述
整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路。保证环上任意两点有且只有2条路径互通。图中的其它部分皆隶属城市郊区。
现在,有一位名叫Jim的同学想在B市开店,但是任意一条边的2个点不能同时开店,每个点都有一定的人流量Pi,在该点开店的利润就等于该店的人流量Pi×K(K≤10000),K的值将给出。
Jim想尽量多的赚取利润,请问他应该在哪些地方开店?
输入输出格式
输入格式:
第一行一个整数N 代表城市中点的个数。城市中的N个点由0~N-1编号。
第二行N个正整数,表示每个点的人流量Pi(Pi≤10000)。
下面N行,每行2个整数A,B,表示A,B建有一条双向路。
最后一行一个实数K。
输出格式:
一个实数M,(保留1位小数),代表开店的最大利润。
输入输出样例
说明
【数据范围】
对于20%的数据,N≤100.
对于另外20%的数据,环上的点不超过2000个
对于50%的数据 N≤50000.
对于100%的数据 N≤100000.
- //一道上午的时候不知道哪错了发了讨论然后放弃了的题。
- //感谢@sqairy 大佬 一语道破我的错误所在
- //楼下都用的dfs找环,当时没想出用dfs做来,所以在输入的时候处理的环
- //因为如果一条边的端点已经全部出现的话,我们把这条边加进去,就构成了一个环,
- //所以开一个flag[]标记,标记这个点有没有输入过,
- //如果 flag[u]&&flag[v],那么这肯定是一个环上的一条边,然后让A=u,B=v,
- //并且我们不把这条边加进图里,这样就构成了一棵树
- //从A,B做两次树形DP,找最大值。 和没有上司的舞会那道题一样
- //还有就是要取max(dp[A][0],dp[B][0]),
- //为什么是不选A和B的情况的最大值:
- //因为我们如果是在选A或B的情况中取最大值,我们不能保证A(B)选了,但是B(A)没选
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=1e6+;
- int n,A,B;
- double K;
- int p[N];
- int head[N],num_edge;
- bool flag[N];
- double dp[N][];
- struct Edge
- {
- int v,nxt;
- }edge[N<<];
- int read()
- {
- char c=getchar();int num=;
- for(;!isdigit(c);c=getchar());
- for(;isdigit(c);c=getchar())
- num=num*+c-'';
- return num;
- }
- void add_edge(int u,int v)
- {
- edge[++num_edge].v=v;
- edge[num_edge].nxt=head[u];
- head[u]=num_edge;
- }
- void dfs(int u,int fa)
- {
- dp[u][]=p[u],dp[u][]=;
- for(int i=head[u],v;i;i=edge[i].nxt)
- {
- v=edge[i].v;
- if(v==fa)
- continue;
- dfs(v,u);
- dp[u][]+=max(dp[v][],dp[v][]); //这个点不选,加上它的儿子选或不选的最大值
- dp[u][]+=dp[v][]; //这个点选,它的儿子们不能选
- }
- }
- int main()
- {
- n=read();
- for(int i=;i<n;++i)
- p[i]=read();
- bool ok=; //标记找没找到环
- for(int i=,u,v;i<=n;++i)
- {
- u=read(),v=read();
- if(!ok&&flag[u]&&flag[v]) //一条边的两个端点都出现过,那么着肯定是一个环上的边
- {
- ok=; //找到环了
- A=u,B=v; //记录两个端点
- continue; //不加这条边
- }
- flag[u]=flag[v]=; //标记两个端点已经出现过
- add_edge(u,v); //加边
- add_edge(v,u);
- }
- scanf("%lf",&K);
- dfs(A,A); //从A跑DFS
- double ans=dp[A][];
- dfs(B,B); //从B跑DFS
- ans=max(ans,dp[B][]);
- printf("%.1lf",ans*K);
- return ;
- }
P1453 城市环路的更多相关文章
- BSOJ3760||洛谷P1453 城市环路 题解
城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...
- 洛谷 P1453 城市环路 ( 基环树树形dp )
题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...
- luogu P1453 城市环路
题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...
- LUOGU P1453 城市环路(基环树+dp)
传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...
- 题解 P1453 【城市环路】
P1453 城市环路 感觉基环树(or环套树)的题目一般都是找到树上的环,断掉一条边再进行树上的操作(如noip2018P5022 旅行) 双倍经验:P2607 [ZJOI2008]骑士 P1453和 ...
- [ZJOI2008]骑士 题解
题面 这道题稍微想一想就会联想到树形DP的入门题:没有上司的舞会: 但是再想一想会发现这根本就不是一颗树,因为它比树多了一条边: 这时候我们引入一个新的概念:基环树: 顾名思义(??),基环树就是在一 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- 2018 AI产业界大盘点
2018 AI产业界大盘点 大事件盘点 “ 1.24——Facebook人工智能部门负责人Yann LeCun宣布卸任 Facebook人工智能研究部门(FAIR)的负责人Yann LeCun宣布卸 ...
- dp学习(二)
树和图上的dp. 4. 简单树形dp 这些是最为简单的树形dp. 一般来说,树形dp是通过子树的dp值推出当前点的dp值. 在这里,我们默认当前节点为u,它的儿子节点为v,树的根为rt. 例题4.1 ...
随机推荐
- 提高QPS
常用方案 1.异步化+MQ 即非阻塞,化繁为简,拿到你需要处理的资源后尽快回复.适用于事务处理场景,且无需对上游返回数据场景. 2.无锁设计 本质上是要降低锁冲突,基于数据版本的乐观锁 有效的减少了互 ...
- android 给ImageView设置路径
ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...
- Android JSBridge原理与实现
在Android中,JSBridge已经不是什么新鲜的事物了,各家的实现方式也略有差异.大多数人都知道WebView存在一个漏洞,详细信息见你不知道的 Android WebView 使用漏洞,虽然该 ...
- mysql json字段
从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型. 一. 创建json(不可以设置长度,可以是null,不能用有默认值) mysql> CREATE TABLE ...
- 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not.."
Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示“Spring Boot Configuration Annotation Processo ...
- Python_文件相关操作
1.open(filePath,type)方法:打开文件 filePath:文件路径 type:操作文件的方式(r:读取,w:覆盖写入,a:追加写入) 2.strip()方法:去除读取到的每行内容后的 ...
- XML知识学习
第一部分[基础篇]: https://www.w3school.com.cn/xml/xml_intro.asp W3C教程地址 什么是 XML? XML 指可扩展标记语言(EXtensible Ma ...
- springboot学习笔记(二)—— springboot的启动模式设置
把springboot的启动类图标(spring)去掉,在启动类中添加以下代码 package com.xdr.spring; import org.springframework.boot.Bann ...
- pandas速查手册(中文版)
本文翻译自文章:Pandas Cheat Sheet - Python for Data Science 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包.它 ...
- python中while循环的基本使用
一.while循环 while 条件: 如果条件为True,会一直循环 代码块(循环体) else: 当上面的条件为假.才会执行 执行顺序:判断条件是否为真.如果真,执行循环 ...