main
黄海 2 years ago
parent c571254813
commit a16f2c7e5c

@ -1,15 +1,18 @@
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
typedef pair<int, int> 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++)

@ -138,16 +138,19 @@ maxd[i] + maxd[j] + get(q[i], q[j])
```cpp {.line-numbers}
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
typedef pair<int, int> 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++) // ii()
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++)

Loading…
Cancel
Save