题目背景

一座城市,往往会被人们划分为几个区域,例如住宅区、商业区、工业区等等。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位小数),代表开店的最大利润。

输入输出样例

输入样例#1: 复制

  1. 4
  2. 1 2 1 5
  3. 0 1
  4. 0 2
  5. 1 2
  6. 1 3
  7. 2
输出样例#1: 复制

  1. 12.0

说明

【数据范围】

对于20%的数据,N≤100.

对于另外20%的数据,环上的点不超过2000个

对于50%的数据 N≤50000.

对于100%的数据 N≤100000.

  1. //一道上午的时候不知道哪错了发了讨论然后放弃了的题。
  2. //感谢@sqairy 大佬 一语道破我的错误所在
  3.  
  4. //楼下都用的dfs找环,当时没想出用dfs做来,所以在输入的时候处理的环
  5. //因为如果一条边的端点已经全部出现的话,我们把这条边加进去,就构成了一个环,
  6. //所以开一个flag[]标记,标记这个点有没有输入过,
  7. //如果 flag[u]&&flag[v],那么这肯定是一个环上的一条边,然后让A=u,B=v,
  8. //并且我们不把这条边加进图里,这样就构成了一棵树
  9. //从A,B做两次树形DP,找最大值。 和没有上司的舞会那道题一样
  10. //还有就是要取max(dp[A][0],dp[B][0]),
  11. //为什么是不选A和B的情况的最大值:
  12. //因为我们如果是在选A或B的情况中取最大值,我们不能保证A(B)选了,但是B(A)没选
  13.  
  14. #include<iostream>
  15. #include<cstdio>
  16. #include<cstring>
  17. #include<cstdio>
  18. #include<algorithm>
  19. using namespace std;
  20.  
  21. const int N=1e6+;
  22.  
  23. int n,A,B;
  24. double K;
  25. int p[N];
  26. int head[N],num_edge;
  27. bool flag[N];
  28. double dp[N][];
  29. struct Edge
  30. {
  31. int v,nxt;
  32. }edge[N<<];
  33.  
  34. int read()
  35. {
  36. char c=getchar();int num=;
  37. for(;!isdigit(c);c=getchar());
  38. for(;isdigit(c);c=getchar())
  39. num=num*+c-'';
  40. return num;
  41. }
  42.  
  43. void add_edge(int u,int v)
  44. {
  45. edge[++num_edge].v=v;
  46. edge[num_edge].nxt=head[u];
  47. head[u]=num_edge;
  48. }
  49.  
  50. void dfs(int u,int fa)
  51. {
  52. dp[u][]=p[u],dp[u][]=;
  53. for(int i=head[u],v;i;i=edge[i].nxt)
  54. {
  55. v=edge[i].v;
  56. if(v==fa)
  57. continue;
  58. dfs(v,u);
  59. dp[u][]+=max(dp[v][],dp[v][]); //这个点不选,加上它的儿子选或不选的最大值
  60. dp[u][]+=dp[v][]; //这个点选,它的儿子们不能选
  61. }
  62. }
  63.  
  64. int main()
  65. {
  66. n=read();
  67. for(int i=;i<n;++i)
  68. p[i]=read();
  69. bool ok=; //标记找没找到环
  70. for(int i=,u,v;i<=n;++i)
  71. {
  72. u=read(),v=read();
  73. if(!ok&&flag[u]&&flag[v]) //一条边的两个端点都出现过,那么着肯定是一个环上的边
  74. {
  75. ok=; //找到环了
  76. A=u,B=v; //记录两个端点
  77. continue; //不加这条边
  78. }
  79. flag[u]=flag[v]=; //标记两个端点已经出现过
  80. add_edge(u,v); //加边
  81. add_edge(v,u);
  82. }
  83. scanf("%lf",&K);
  84. dfs(A,A); //从A跑DFS
  85. double ans=dp[A][];
  86. dfs(B,B); //从B跑DFS
  87. ans=max(ans,dp[B][]);
  88. printf("%.1lf",ans*K);
  89. return ;
  90. }

P1453 城市环路的更多相关文章

  1. BSOJ3760||洛谷P1453 城市环路 题解

    城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...

  2. 洛谷 P1453 城市环路 ( 基环树树形dp )

    题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...

  3. luogu P1453 城市环路

    题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...

  4. LUOGU P1453 城市环路(基环树+dp)

    传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...

  5. 题解 P1453 【城市环路】

    P1453 城市环路 感觉基环树(or环套树)的题目一般都是找到树上的环,断掉一条边再进行树上的操作(如noip2018P5022 旅行) 双倍经验:P2607 [ZJOI2008]骑士 P1453和 ...

  6. [ZJOI2008]骑士 题解

    题面 这道题稍微想一想就会联想到树形DP的入门题:没有上司的舞会: 但是再想一想会发现这根本就不是一颗树,因为它比树多了一条边: 这时候我们引入一个新的概念:基环树: 顾名思义(??),基环树就是在一 ...

  7. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  8. 2018 AI产业界大盘点

    2018  AI产业界大盘点 大事件盘点 “ 1.24——Facebook人工智能部门负责人Yann LeCun宣布卸任 Facebook人工智能研究部门(FAIR)的负责人Yann LeCun宣布卸 ...

  9. dp学习(二)

    树和图上的dp. 4. 简单树形dp 这些是最为简单的树形dp. 一般来说,树形dp是通过子树的dp值推出当前点的dp值. 在这里,我们默认当前节点为u,它的儿子节点为v,树的根为rt. 例题4.1 ...

随机推荐

  1. 提高QPS

    常用方案 1.异步化+MQ 即非阻塞,化繁为简,拿到你需要处理的资源后尽快回复.适用于事务处理场景,且无需对上游返回数据场景. 2.无锁设计 本质上是要降低锁冲突,基于数据版本的乐观锁 有效的减少了互 ...

  2. android 给ImageView设置路径

    ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...

  3. Android JSBridge原理与实现

    在Android中,JSBridge已经不是什么新鲜的事物了,各家的实现方式也略有差异.大多数人都知道WebView存在一个漏洞,详细信息见你不知道的 Android WebView 使用漏洞,虽然该 ...

  4. mysql json字段

    从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型.   一. 创建json(不可以设置长度,可以是null,不能用有默认值) mysql> CREATE TABLE ...

  5. 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not.."

    Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示“Spring Boot Configuration Annotation Processo ...

  6. Python_文件相关操作

    1.open(filePath,type)方法:打开文件 filePath:文件路径 type:操作文件的方式(r:读取,w:覆盖写入,a:追加写入) 2.strip()方法:去除读取到的每行内容后的 ...

  7. XML知识学习

    第一部分[基础篇]: https://www.w3school.com.cn/xml/xml_intro.asp W3C教程地址 什么是 XML? XML 指可扩展标记语言(EXtensible Ma ...

  8. springboot学习笔记(二)—— springboot的启动模式设置

    把springboot的启动类图标(spring)去掉,在启动类中添加以下代码 package com.xdr.spring; import org.springframework.boot.Bann ...

  9. pandas速查手册(中文版)

    本文翻译自文章:Pandas Cheat Sheet - Python for Data Science 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包.它 ...

  10. python中while循环的基本使用

    一.while循环 while 条件:              如果条件为True,会一直循环 代码块(循环体) else: 当上面的条件为假.才会执行 执行顺序:判断条件是否为真.如果真,执行循环 ...