首页 > 其他分享 >CF666B World Tour

CF666B World Tour

时间:2023-10-04 10:45:51浏览次数:49  
标签:int CF666B Tour 枚举 dx World include id dis

World Tour の 传送门

\(4 \le n \le 3000\)

说明可以用 \(n^2\) 的做法,题目要求 \(4\) 个点的最短路最长,共 \(3\) 条路经,则枚举 \(2\) 个点。

如果枚举 \(a, c\),则要找 \(b, d\),但 \(b\) 和 \(c\) 也要判断路径,比较麻烦,所以直接枚举 \(b, c\)。

然后枚举 \(b, c\) 对应的最短路最长的点,因为枚举点共会 \(6\) 种重合情况,而 \(b, c\) 已经判掉了,所以只有 \(5\) 种情况,就直接枚举最短路最长的前 \(5\) 个 \(a\),\(d\) 同理。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <utility>
#include <vector>
#include <queue>
#define d first
#define id second
using namespace std;
constexpr int N = 3e3 + 5;
int n, m, vis[N];
vector<int> g[N];
int pre[N][N], dx[N][N];
pair<int, int> dis[N][N];
inline void dij(int s) {
	memset(dis[s], -1, sizeof(dis[s]));
	dis[s][s].d = 0;
	memset(dx[s], -1, sizeof(dx[s]));
	dx[s][s] = 0;
	for (int i = 1; i <= n; ++i)
		dis[s][i].id = i;
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
	q.push({0, s});
	while (!q.empty()) {
		int u = q.top().id;
		q.pop();
		vis[u] = 1;
		for (int l = 0; l < g[u].size(); ++l) {
			int i = g[u][l];
			if (dis[s][i].d > dis[s][u].d + 1 || dis[s][i].d == -1) {
				dis[s][i].d = dis[s][u].d + 1;
				dx[s][i] = dx[s][u] + 1;
				if (!vis[i])	q.push({dis[s][i].d, i});
			}
		}
	}
	sort(dis[s] + 1, dis[s] + n + 1, greater<pair<int, int>>());
}
int id;
inline bool cmp(int a, int b) {
	return dx[a][id] > dx[b][id];
}
inline void special() {
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j)
			if (dx[j][i] != -1)	pre[i][j] = j;
		id = i;
		sort(pre[i] + 1, pre[i] + n + 1, cmp);
	}
}
signed main() {
	cin >> n >> m;
	while (m--) {
		int u, v;
		cin >> u >> v;
		g[u].emplace_back(v);
	}
	for (int i = 1; i <= n; ++i) {
		memset(vis, 0, sizeof(vis));
		dij(i);
// 		cerr << "DIJ " << i << '\n';
// 		for (int j = 1; j <= n; ++j)
// 			cerr << "  " << dis[i][j].id << ' ' << dis[i][j].d << '\n';
	}
	special();
	int ans = 0, anss[5];
	for (int j = 1; j <= n; ++j)
		for (int k = 1; k <= n; ++k) {
			if (j == k || dx[j][k] == -1)	continue;
			for (int ix = 1; ix <= min(3, n); ++ix) {
				int i = pre[j][ix];
				if (i == j || k == i || i == 0)	continue;
				for (int lx = 1; lx <=  min(3, n); ++lx) {
					int l = dis[k][lx].id;
					if (i == l || k == l || j == l || l == 0)	continue;
					if (ans < dx[i][j] + dx[j][k] + dx[k][l]) {
						ans = dx[i][j] + dx[j][k] + dx[k][l];
//						printf("YEAH %d %d %d %d\n  %d %d %d\n", i, j, k, l, dx[i][j], dx[j][k], dx[k][l]);
						anss[1] = i, anss[2] = j, anss[3] = k, anss[4] = l;
					}
				}
			}
		}
	for (int i = 1; i <= 4; ++i)
		cout << anss[i] << ' ';
	return 0;
}

标签:int,CF666B,Tour,枚举,dx,World,include,id,dis
From: https://www.cnblogs.com/Silver-Wolf/p/17742012.html

相关文章

  • P1522 [USACO2.4] 牛的旅行 Cow Tours
    Problem题目简述给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值。思路本题主要做法:\(Floyd\)。首先,Floyd求出任意两个点之间的最短路。枚举每一个点,求出以这个点能走到的所有点中距离的最大值。(一定在能走到的情况下,不然默认距离就是......
  • IntelliJ 中的 Hello World
    你已经下载了IntelliJ,我们现在来看看如何使用它。下面是在IntelliJ中创建 Helloworld 程序的文本说明!1.打开IntelliJ第一次打开IntelliJ时,你将看到一个这样的欢迎界面和选项,可以利用这些选项创建一个新项目、导入或打开一个项目。我们来开始一个新项目,选择创建新项目......
  • LOJ 6479 [ICPC World Finals 2017] 小小水管工 Son of Pipe Stream 题解
    更好的阅读体验题意原题链接给出\(n\)个城市和\(m\)条双向管道,以及两个实数\(v\)和\(a\)。有两种液体,分别是水和Flubber(下面简写为W和F)。\(1\)号和\(2\)号城市分别生产Flubber和水,并通过管道流入\(3\)号城市。对于一条管道,其中可以同时存在两种液体,但是方向......
  • Node.js vs. Spring Boot:Hello World 性能对决,谁更快一点?
    前言:SpringBoot在Java生态中备受欢迎,它是一款基于Java构建的轻量级服务端框架,主要用于Web服务。SpringBoot的应用使得创建各类基于Spring的企业级应用变得异常简单。Node.js作为一种基于ChromeV8引擎的JavaScript运行时环境,在服务端上运行JavaScript代码。它以其独......
  • Node.js vs. Spring Boot:Hello World 性能对决,谁更快一点?
    前言:SpringBoot在Java生态中备受欢迎,它是一款基于Java构建的轻量级服务端框架,主要用于Web服务。SpringBoot的应用使得创建各类基于Spring的企业级应用变得异常简单。Node.js作为一种基于ChromeV8引擎的JavaScript运行时环境,在服务端上运行JavaScript代码。它以其独特......
  • Oracle CloudWorld 2023:Safra Catz主题演讲——把客户的成功放在首要位置
    SafraCatz在OracleCloudWorld2023的开场演讲主题是“把客户的成功放在首要位置”。她强调了客户的重要性,并说大家通过合作和技术可以实现几乎一切。她感谢在场的观众,强调了学习和分享的重要性,以及公司致力于为客户提供更好服务的承诺。在演讲中,她还邀请了来自其他公司的高管......
  • Hello,World!
    JDK、JRE、JVMJDK:Java发展工具(包含JRE)JRE:Java运行环境JVM:Java虚拟器JDK安装下载安装包安装设置环境变量新建“JAVA_HOME”--安装路径编辑PATH路径--新建(复制bin路径)--新建(jre\bin路径)验证java-versionHello,World!新建文件夹存放代码新建java文件H......
  • HelloWorld写法
    HelloWorld随便新建一个文件夹,存放代码新建一个java文件文件后缀为javaHelloWorld.java如果系统没有显示后缀需要自己手动打开编写代码publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.print("HelloWorld!!!");}......
  • 最经典的HelloWorld
    最经典的HelloWorldpublicclassHelloWorld{ publicstaticvoidmain(String[]args){ System.out.print("HelloWorld!"); }}已经好长时间没有写过这种java代码了,忘掉了好多细节,希望自己能够坚持......
  • javascript: The Best Guided Tour Plugin
    BestTourPluginsToGuideVisitorsThroughYourApphttps://yonkov.github.io/post/display-shepherd-only-once/https://www.jqueryscript.net/blog/best-guided-tour.htmlhttps://whatfix.com/blog/react-onboarding-tour/https://github.com/shipshapecode/shepherdhtt......