https://codeforces.com/problemset/problem/667/D
【题意】n个点,m条有向边,找4个有顺序的点,使得4个点三条有向最短路之和最大
【思路】枚举第2,3,个点,预处理出每个点到其余点的距离,取3个最大的比较,避免重复
【代码】
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 5e3+6;
const int maxn1 = 3e3 + 6;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
int n, m;
vector<int>v[maxn],vv[maxn];
int d[maxn1][maxn1], dd[maxn1][maxn1];
struct node {
int id, x;
}k[maxn][maxn],kk[maxn][maxn];
int cmp(node a, node b) {
return a.x > b.x;
}
int cnt[maxn],cnt1[maxn];
void init_bfs() {
memset(d, -1, sizeof(d));
for (int i = 1; i <= n; i++) {
queue<int>q;
q.push(i);
d[i][i] = 0;
while (q.size()) {
int x = q.front(); q.pop();
for (int y : v[x]) {
if (d[i][y] == -1) {
d[i][y] = d[i][x] + 1;
k[i][cnt[i]].id = y;
k[i][cnt[i]++].x = d[i][y];
q.push(y);
}
}
}
}
for (int i = 1; i <= n; i++) {
sort(k[i], k[i] + cnt[i], cmp);
}
}
void init_bfs1() {
memset(dd, -1, sizeof(dd));
for (int i = 1; i <= n; i++) {
queue<int>q;
q.push(i);
dd[i][i] = 0;
while (q.size()) {
int x = q.front(); q.pop();
for (int y : vv[x]) {
if (dd[i][y] == -1) {
dd[i][y] = dd[i][x] + 1;
kk[i][cnt1[i]].id = y;
kk[i][cnt1[i]++].x = dd[i][y];
q.push(y);
}
}
}
}
for (int i = 1; i <= n; i++) {
sort(kk[i], kk[i] + cnt1[i], cmp);
}
}
int main() {
while (~scanf("%d%d", &n, &m)) {
while (m--) {
int uuu, vvv;
scanf("%d%d", &uuu, &vvv);
v[uuu].push_back(vvv);
vv[vvv].push_back(uuu);
}
init_bfs();
init_bfs1();
int Max = 0;
int dex[4];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(d[i][j] == -1)continue;
if (i == j)continue;
int sum = 0;
for (int h = 0; h < 4; h++) {
if (kk[i][h].id == 0||kk[i][h].id==i)continue;
for (int hh = 0; hh < 4; hh++) {
if (k[j][hh].id == 0||k[j][hh].id==j)continue;
if (kk[i][h].id != j && kk[i][h].id != k[j][hh].id&&k[j][hh].id != i) {
sum = kk[i][h].x + k[j][hh].x + d[i][j];
if (sum > Max) {
Max = sum;
dex[0] = kk[i][h].id;
dex[1] = i;
dex[2] = j;
dex[3] = k[j][hh].id;
}
}
}
}
}
}
printf("%d %d %d %d\n", dex[0], dex[1], dex[2], dex[3]);
}
}