WA on #20 求助
查看原帖
WA on #20 求助
688783
SilverLi楼主2023/10/2 17:32
#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() {
//	freopen("worldtour.in", "r", stdin);
	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;
			int cnti = 0;
			for (int ix = 1; cnti <= 3&& ix <= n; ++ix) {
				int i = pre[j][ix];
				if (i == j || k == i)	continue;
				++cnti;
				int cntl = 0;
				for (int lx = 1; cntl <= 3 && lx <= n; ++lx) {
					int l = dis[k][lx].id;
					if (i == l || k == l || j == l)	continue;
					++cntl;
					if (ans < dx[i][j] + dx[j][k] + dis[k][lx].d) {
						ans = dx[i][j] + dx[j][k] + dis[k][lx].d;
//						printf("YEAH %d %d %d %d\n  %d %d %d\n", i, j, k, l, dx[i][j], dx[j][k], dis[k][lx].d);
						anss[1] = i, anss[2] = j, anss[3] = k, anss[4] = l;
					}
				}
			}
		}
	for (int i = 1; i <= 4; ++i)
		cout << anss[i] << ' ';
	return 0;
}

2023/10/2 17:32
加载中...