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 ...
随机推荐
- 通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
原文:通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息 WPF 框架自己实现了一套触摸机制,但同一窗口只能支持一套触摸机制,于是这会禁用系统的触摸消 ...
- win10 查看本机的激活秘钥
系统的注册表中,找到如下位置 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectio ...
- sourceTree 3.X免注册[学习]
一. 在路径C:\****\AppData\Local\Atlassian\SourceTree下创建accounts.json文件 [ { "$id": "1" ...
- vue计算属性的使用
props:['name'],//接收父组件的数据 computed:{//当数据发生改变时,会自动去计算 zojia:function(){ //zojia是自己声明的函数 let a = null ...
- BIN文件合并烧写
可以实现将Bootloader和Application合并烧写 使用UBIN.exe工具或者J-Flash工具 UBIN工具 选择Bootloader源文件 添加Bootloader源文件 选择App ...
- MySQL Hardware--RAID卡BBU Learn Cycle
RAID卡缓存策略 不同的RAID卡缓存策略对IO的性能影响较大,常见的策略有: 1.写操作策略,可设置为WriteBack或WriteThrough WriteBack:进行写操作时,将数据写入RA ...
- k8s 应用优先级,驱逐,波动,动态资源调整
k8s 应用优先级,驱逐,波动,动态资源调整 应用优先级 Requests 和 Limits 的配置除了表明资源情况和限制资源使用之外,还有一个隐藏的作用:它决定了 Pod 的 QoS 等级. 上一节 ...
- # Spring Boot & thymeleaf模板 使用 th:each 遍历对象数组 -生成一批html标签体
在controller中取出emps 对象数组 //1.查询所有的员工,返回列表页面 @GetMapping("/emps") public String list(Model m ...
- python处理yml
#pip install pyyamlimport yaml #yaml文件转成字典 with open('a.yml','rb')as f: res = yaml.load(f,Loader=yam ...
- Spring Cloud 组件 —— hystrix
作用与功能 ① 资源隔离, 每个依赖配备单独的线程池,为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间.② 依赖超时,可配置依赖调用超时时间,超 ...