From a16f2c7e5c08b3bd1e93c5c05b879714f203fecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Wed, 3 Jan 2024 08:23:14 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T3/Floyd/1125.cpp | 20 ++++++++++++-------- TangDou/AcWing_TiGao/T3/Floyd/1125.md | 20 ++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/TangDou/AcWing_TiGao/T3/Floyd/1125.cpp b/TangDou/AcWing_TiGao/T3/Floyd/1125.cpp index d5dcf74..36254ae 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/1125.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/1125.cpp @@ -1,15 +1,18 @@ #include using namespace std; + +typedef pair PII; #define x first #define y second -typedef pair PII; + const int N = 160; const int INF = 0x3f3f3f3f; - PII q[N]; // 每个点的坐标 char g[N][N]; // 邻接矩阵,记录是否中间有边 -double dis[N][N]; // 每两个牧区之间的距离 -double maxd[N]; // 距离牧区i最远的最短距离是多少 +double dis[N][N]; // 每两个牧区(点)之间的距离 +double maxd[N]; // maxd[i]:由i点出发,可以到达的最远的最短距离是多少 +// Q:什么是最远的最短距离? +// 答:举个不太恰当的例子,比如A->B->C->D,边权都是1 ,同时存在一条A->D,边权是1。此时,有短的不取长的,所以A->D的距离是1,不是3。 // 欧几里得距离 double get(PII a, PII b) { @@ -25,6 +28,7 @@ int main() { // 邻接矩阵,描述点与点之间的连通关系 // 这个用int还没法读入,因为它的输入是连续的,中间没有空格,讨厌啊~ + // 字符数组与scanf("%s",g[i])相结合,直接写入二维数组g的每一行上,这个技巧是值得我们学习的。 for (int i = 0; i < n; i++) scanf("%s", g[i]); // 遍历行与列,计算出每两个点之间的距离 @@ -53,17 +57,17 @@ int main() { for (int j = 0; j < n; j++) dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); - // ② 未建设两个连通块之间线路前,每个点的最长 最短路径 - // maxd[i]:由i出发,可以走的最远距离 + // ② (1)求出未建设两个连通块之间线路前,所有连通块的直径最大值res1 + // (2)求出未建设两个连通块之间线路前,每个点的可以到达的最远最短距离,下一步做模拟连线时会用到 double res1 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) // 求i到离i(最短路径) 最长距离 if (dis[i][j] < INF) maxd[i] = max(maxd[i], dis[i][j]); - // 所有点的最远距离PK,可以获取到最大直径 + // 所有点的最远距离PK,获取所有连通块的最大直径 res1 = max(res1, maxd[i]); } - // ③ 连线操作,更新新牧场直径 + // ③ 模拟连线操作,看看这样连线后生成的新牧场直径会不会刷新原来的记录 double res2 = INF; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) diff --git a/TangDou/AcWing_TiGao/T3/Floyd/1125.md b/TangDou/AcWing_TiGao/T3/Floyd/1125.md index bbf9310..a62d048 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/1125.md +++ b/TangDou/AcWing_TiGao/T3/Floyd/1125.md @@ -138,16 +138,19 @@ maxd[i] + maxd[j] + get(q[i], q[j]) ```cpp {.line-numbers} #include using namespace std; + +typedef pair PII; #define x first #define y second -typedef pair PII; + const int N = 160; const int INF = 0x3f3f3f3f; - PII q[N]; // 每个点的坐标 char g[N][N]; // 邻接矩阵,记录是否中间有边 -double dis[N][N]; // 每两个牧区之间的距离 -double maxd[N]; // 距离牧区i最远的最短距离是多少 +double dis[N][N]; // 每两个牧区(点)之间的距离 +double maxd[N]; // maxd[i]:由i点出发,可以到达的最远的最短距离是多少 +// Q:什么是最远的最短距离? +// 答:举个不太恰当的例子,比如A->B->C->D,边权都是1 ,同时存在一条A->D,边权是1。此时,有短的不取长的,所以A->D的距离是1,不是3。 // 欧几里得距离 double get(PII a, PII b) { @@ -163,6 +166,7 @@ int main() { // 邻接矩阵,描述点与点之间的连通关系 // 这个用int还没法读入,因为它的输入是连续的,中间没有空格,讨厌啊~ + // 字符数组与scanf("%s",g[i])相结合,直接写入二维数组g的每一行上,这个技巧是值得我们学习的。 for (int i = 0; i < n; i++) scanf("%s", g[i]); // 遍历行与列,计算出每两个点之间的距离 @@ -191,17 +195,17 @@ int main() { for (int j = 0; j < n; j++) dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); - // ② 未建设两个连通块之间线路前,每个点的最长 最短路径 - // maxd[i]:由i出发,可以走的最远距离 + // ② (1)求出未建设两个连通块之间线路前,所有连通块的直径最大值res1 + // (2)求出未建设两个连通块之间线路前,每个点的可以到达的最远最短距离,下一步做模拟连线时会用到 double res1 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) // 求i到离i(最短路径) 最长距离 if (dis[i][j] < INF) maxd[i] = max(maxd[i], dis[i][j]); - // 所有点的最远距离PK,可以获取到最大直径 + // 所有点的最远距离PK,获取所有连通块的最大直径 res1 = max(res1, maxd[i]); } - // ③ 连线操作,更新新牧场直径 + // ③ 模拟连线操作,看看这样连线后生成的新牧场直径会不会刷新原来的记录 double res2 = INF; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++)