From f50e50fbc526b6713cff12c48c004bd4c82294bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 5 Jan 2024 11:43:02 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/P1364.cpp | 38 ++++++++++++++++++++++++++ TangDou/Topic/【Floyd专题】.md | 44 ++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 TangDou/Topic/P1364.cpp diff --git a/TangDou/Topic/P1364.cpp b/TangDou/Topic/P1364.cpp new file mode 100644 index 0000000..4cd6375 --- /dev/null +++ b/TangDou/Topic/P1364.cpp @@ -0,0 +1,38 @@ +#include +using namespace std; +const int N = 1000010; +const int INF = 0x3f3f3f3f; + +int g[150][150]; +int w[N]; // 居民人口数,点权 + +int main() { + int n; + cin >> n; + + // 地图初始化 + memset(g, 0x3f, sizeof g); + for (int i = 1; i <= n; i++) g[i][i] = 0; + + for (int i = 1; i <= n; i++) { + int a, b; + cin >> w[i] >> a >> b; // w[i]:点权 + g[i][a] = g[a][i] = 1; // i<->a无向边 + g[i][b] = g[b][i] = 1; // i<->b无向边 + } + + // floyd + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + if (g[i][j] > g[i][k] + g[k][j]) g[i][j] = g[i][k] + g[k][j]; + + int ans = INF; + for (int i = 1; i <= n; i++) { // 如果将医院设置在i处,那么计算一下它到各地的加权和 + int s = 0; + for (int j = 1; j <= n; j++) s += w[j] * g[i][j]; + ans = min(ans, s); + } + printf("%d", ans); + return 0; +} \ No newline at end of file diff --git a/TangDou/Topic/【Floyd专题】.md b/TangDou/Topic/【Floyd专题】.md index f760c7a..bf389d1 100644 --- a/TangDou/Topic/【Floyd专题】.md +++ b/TangDou/Topic/【Floyd专题】.md @@ -489,10 +489,50 @@ int main() { ``` -SSL-1761(城市问题) - #### [$P1364$ 医院设置](https://www.luogu.com.cn/problem/P1364) +```cpp {.line-numbers} +#include +using namespace std; +const int N = 1000010; +const int INF = 0x3f3f3f3f; + +int g[150][150]; +int w[N]; // 居民人口数,点权 + +int main() { + int n; + cin >> n; + + // 地图初始化 + memset(g, 0x3f, sizeof g); + for (int i = 1; i <= n; i++) g[i][i] = 0; + + for (int i = 1; i <= n; i++) { + int a, b; + cin >> w[i] >> a >> b; // w[i]:点权 + g[i][a] = g[a][i] = 1; // i<->a无向边 + g[i][b] = g[b][i] = 1; // i<->b无向边 + } + + // floyd + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + if (g[i][j] > g[i][k] + g[k][j]) g[i][j] = g[i][k] + g[k][j]; + + int ans = INF; + for (int i = 1; i <= n; i++) { // 如果将医院设置在i处,那么计算一下它到各地的加权和 + int s = 0; + for (int j = 1; j <= n; j++) s += w[j] * g[i][j]; + ans = min(ans, s); + } + printf("%d", ans); + return 0; +} +``` + SSL-1613=CCF1342(最短路径问题) +SSL-1761(城市问题)