From 6a997e87169bd62a95683859cc000fdd8d225e90 Mon Sep 17 00:00:00 2001 From: hanyixuanten Date: Tue, 27 Oct 2026 02:40:18 +0000 Subject: [PATCH] new file: P1453.cpp --- P1453.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++ P1453.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 P1453.cpp create mode 100644 P1453.md diff --git a/P1453.cpp b/P1453.cpp new file mode 100644 index 0000000..45f78f1 --- /dev/null +++ b/P1453.cpp @@ -0,0 +1,49 @@ +#include +#define int long long +using namespace std; +int n; +int p[100005]; +vector fri[100005]; +long double k; +int bc[100005]; +int find(int now) { + if(bc[now] == now) return now; + return bc[now] = find(bc[now]); +} +int dps[100005][2], dpt[100005][2]; +void dfs(int now, bool s, int from) { + if(s) dps[now][1] = p[now]; + else dpt[now][1] = p[now]; + if(s && now == T) dps[now][1] = LLONG_MIN; + else if(!s && now == S) dpt[now][1] = LLONG_MIN; + for(int i:fri[now]) { + if(i == from) continue; + dfs(i, s, now); + if(s) dps[now][1] += dps[i][0], dps[now][0] += max(dps[i][0], dps[i][1]); + else dpt[now][1] += dpt[i][0], dpt[now][0] += max(dpt[i][0], dpt[i][1]); + } +} +signed main() { + int S, T; + scanf("%lld", &n); + for(int i = 0; i < n; ++i) { + scanf("%lld", &p[i]); + bc[i] = i; + } + for(int i = 0, u, v; i < n; ++i) { + scanf("%lld%lld", &u, &v); + if(find(u) == find(v)) { + S = u, T = v; + } else { + fri[u].push_back(v); + fri[v].push_back(u); + bc[find(u)] = find(v); + } + } + scanf("%llf", &k); + dfs(S, 1, -1); + dfs(T, 0, -1); + int ans = max(max(dps[S][0], dps[S][1]), max(dpt[T][1], dpt[T][0])); + printf("%.1llf\n", ans * k); + return 0; +} \ No newline at end of file diff --git a/P1453.md b/P1453.md new file mode 100644 index 0000000..97510bb --- /dev/null +++ b/P1453.md @@ -0,0 +1,57 @@ +# P1453 城市环路 + +## 题目描述 + +一座城市,往往会被人们划分为几个区域,例如住宅区、商业区、工业区等等。 + +B 市就被分为了以下的两个区域——城市中心和城市郊区。在这两个区域的中间是一条围绕 B 市的环路,环路之内便是 B 市中心。 + + +整个城市可以看做一个 $n$ 个点,$n$ 条边的单圈图(保证图连通),唯一的环便是绕城的环路。保证环上任意两点有且只有 $2$ 条简单路径互通。图中的其它部分皆隶属城市郊区。 + +现在,有一位名叫 Jim 的同学想在 B 市开店,但是任意一条边的 $2$ 个点不能同时开店,每个点都有一定的人流量,第 $i$ 个点的人流量是 $p_i$,在该点开店的利润就等于 $p_i×k$,其中 $k$ 是一个常数。 + +Jim 想尽量多的赚取利润,请问他能获取的利润最大为多少? + +## 输入格式 + +第一行一个整数 $n$,代表城市中点的个数。城市中的 $n$ 个点由 $0 \sim n-1$ 编号。 + +第二行有 $n$ 个整数,第 $(i + 1)$ 个整数表示第 $i$ 个点的人流量 $p_i$。 + +接下来 $n$ 行,每行有两个整数 $u, v$,代表存在一条连接 $u$ 和 $v$ 的道路。 + +最后一行有一个实数,代表常数 $k$。 + +## 输出格式 + +输出一行一个实数代表答案,结果保留一位小数。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +4 +1 2 1 5 +0 1 +0 2 +1 2 +1 3 +2 + +``` + +### 输出 #1 + +``` +12.0 +``` + +## 说明/提示 + +#### 数据规模与约定 + +- 对于 $20\%$ 的数据,保证 $n \leq 100$。 +- 另有 $20\%$ 的数据,保证环上的点不超过 $2000$ 个。 +- 对于 $100\%$ 的数据,保证 $1 \leq n \leq 10^5$,$1 \leq p_i \leq 10^4$,$0 \leq u, v < n$,$0 \leq k \leq 10^4$,$k$ 的小数点后最多有 $6$ 位数字。 \ No newline at end of file