城市环路
城市环路
题目描述
一座城市,往往会被人们划分为几个区域,例如住宅区、商业区、工业区等等。
B 市就被分为了以下的两个区域——城市中心和城市郊区。在这两个区域的中间是一条围绕 B 市的环路,环路之内便是 B 市中心。
整个城市可以看做一个 个点, 条边的单圈图(保证图连通),唯一的环便是绕城的环路。保证环上任意两点有且只有 条简单路径互通。图中的其它部分皆隶属城市郊区。
现在,有一位名叫 Jim 的同学想在 B 市开店,但是任意一条边的 个点不能同时开店,每个点都有一定的人流量,第 个点的人流量是 ,在该点开店的利润就等于 ,其中 是一个常数。
Jim 想尽量多的赚取利润,请问他应该在哪些地方开店?
输入格式
第一行一个整数 ,代表城市中点的个数。城市中的 个点由 编号。
第二行有 个整数,第 个整数表示第 个点的人流量 。
接下来 行,每行有两个整数 ,代表存在一条连接 和 的道路。
最后一行有一个实数,代表常数 。
输出格式
输出一行一个实数代表答案,结果保留一位小数。
样例 #1
样例输入 #1
4
1 2 1 5
0 1
0 2
1 2
1 3
2
样例输出 #1
12.0
提示
数据规模与约定
- 对于 的数据,保证 。
- 另有 的数据,保证环上的点不超过 个。
- 对于 的数据,保证 ,,,, 的小数点后最多有 位数字。
解题思路
如果这题的图是一棵树的话,那么就是没有上司的舞会这道题。而现在从树变成了基环树,那么就会想到能不能从环上选择一条边删掉变成树来做呢?答案是可以的,假设删除的是环上的边 ,那么分别以 和 为树根跑两遍树形 dp 即可,另外由于边 最多能选一个节点,因此还要保证 和 至多选择其中一个。
定义 表示以 为根的子树中不选节点 的所有合法方案的最大权值和, 表示以 为根的子树中选择节点 的所有合法方案的最大权值和。由题目限制知道如果选择了 ,那么其子节点都不能选择,如果不选择 ,那么其子节点可选可不选。因此状态转移方程就是
另外可以通过并查集来得到环上的某条边,当枚举到边 并且两个节点属于同一个连通块中,说明加上这条边就会形成一个环,因此 就是环上的一条边。
为什么要分别对 和 跑一遍树形 dp?如果只对 求一次那么当 时无法保证最优解 不选 ,因此还需要知道 ,那么最终答案就是 (因为至少有一个节点不选)。是否还需要考虑删除环上其他的边并重复这个过程?没有必要,因为只需对边 求一次就知道取最优解时 和 的状态,考虑其他边的最优解时 和 还是这个状态。
AC 代码如下,时间复杂度为 :
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N * 2;
int w[N];
int head[N], e[M], ne[M], idx;
int f[N][2];
int fa[N];
void add(int u, int v) {
e[idx] = v, ne[idx] = head[u], head[u] = idx++;
}
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
void dfs(int u, int pre) {
f[u][0] = 0, f[u][1] = w[u];
for (int i = head[u]; i != -1; i = ne[i]) {
if (e[i] != pre) {
dfs(e[i], u);
f[u][0] += max(f[e[i]][0], f[e[i]][1]);
f[u][1] += f[e[i]][0];
}
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", w + i);
}
memset(head, -1, sizeof(head));
for (int i = 0; i < n; i++) {
fa[i] = i;
}
int r1, r2;
for (int i = 0; i < n; i++) {
int u, v;
scanf("%d %d", &u, &v);
if (find(u) == find(v)) {
r1 = u, r2 = v;
}
else {
fa[find(u)] = find(v);
add(u, v), add(v, u);
}
}
dfs(r1, -1);
int ret = f[r1][0];
dfs(r2, -1);
ret = max(ret, f[r2][0]);
double m;
scanf("%lf", &m);
printf("%.1f", ret * m);
return 0;
}
参考资料
P1453 城市环路 题解:https://www.luogu.com.cn/blog/xcxc82/post-p1453-cheng-shi-huan-lu-ti-xie
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17818288.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效