• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
牛的旅行 Floyd

牛的旅行

题目

牛的旅行

思路

​ 先跑一边Floyd,再分别求每个连通块内的最短距离的最大值,\(dmax[i]\) 表示\(i\)节点的最短距离的最大值\(ans1 = max(ans1, dmax[i])\), 然后再对\(d[x][y] = +\infin\)的点求\(ans2 = min(ans2, maxd[i] + maxd[j] + dist[i][j])\)

最后\(max(ans1, ans2)\)即为答案

Code

#include <iostream>
#include <cstring>
#include <cmath>
#define INF 1e20
using i64 = long long;

const int N = 200;

int n;

double d[N][N], maxd[N];

char a[N][N];

struct node {
	int x, y;
} b[N];

double calc(int i, int j) {
	double a = b[i].x - b[j].x, c = b[i].y - b[j].y;
	return sqrt(a * a + c * c);
}

void floyd() {
	for (int k = 1; k <= n; k ++) {
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= n; j ++) {
				d[i][j] = std::min(d[i][j], d[i][k] + d[k][j]);
			}
		}
	}
}

int main() {
	std::cin >> n;

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			d[i][j] = (i == j)?0:INF;
		}
	}

	for (int i = 1; i <= n; i ++) {
		std::cin >> b[i].x >> b[i].y;
	}

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			std::cin >> a[i][j];
			if (a[i][j] == '1') {
				d[i][j] = calc(i, j);
			}
		}
	}

	floyd();

	double ans = 0;

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			if (d[i][j] != INF)
				maxd[i] = std::max(maxd[i], d[i][j]);
		}
		ans = std::max(ans, maxd[i]);
	}

	double ans2 = INF;

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			if (d[i][j] == INF) {
				ans2 = std::min(ans2, maxd[i] + maxd[j] + calc(i, j));
			}
		}
	}

	printf("%.6lf", std::max(ans, ans2));
}
posted on 2023-04-15 12:00  Jack404  阅读(8)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3