题意
- 给定每个人和其他人的距离
- 没有直接连接的两人的距离是二者的最短路径长度
- 没有连接的两人不做考虑
- 一个人的受欢迎度是1/所有异性到ta的最大距离
- 求男性最受欢迎的人的编号,和女性最受欢迎的人的编号
思路
- floyd求最短路
- 模拟
本题难度在于恶臭的阅读理解
solution
这份代码是赛后完成的,且现在没有开放补题,不能保证完全通过。
upd 2022年5月2日 已通过全部测试用例
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
#define int ll
typedef vector<int> vi;
const int N = 507;
const int INF = 0x3f3f3f3f;
int a[N];
bool male[N];
int g[N][N];
void out(vector<int> a) {
for (int i = 0, n = a.size(); i < n; ++i) {
cout << a[i] << (i == n - 1 ? '\n' : ' ');
}
}
signed main() {
int n;
cin >> n;
cin.ignore();
rep(i, 1, n) a[i] = -1;
rep(i, 1, n) rep(j, 1, n) if (i != j) g[i][j] = INF;
rep(j, 1, n) {
string sex;
cin >> sex;
if (sex == "M") male[j] = 1;
int k, x, s;
cin >> k;
rep(i, 1, k) {
cin >> x;
cin.ignore();
cin >> s;
g[j][x] = s;
}
}
rep(k, 1, n) rep(x, 1, n) rep(y, 1, n) {
g[x][y] = min(g[x][y], g[x][k] + g[k][y]);
}
rep(i, 1, n) rep(j, 1, n) if (male[i] != male[j]) a[i] = max(a[i], g[j][i]);
int maleMin = INF, femaleMin = INF;
rep(i, 1, n) {
if (a[i] != -1) {
if (male[i])
maleMin = min(maleMin, a[i]);
else
femaleMin = min(femaleMin, a[i]);
}
}
vi resM, resF;
rep(i, 1, n) {
if (male[i] && a[i] == maleMin) resM.push_back(i);
if (!male[i] && a[i] == femaleMin) resF.push_back(i);
}
out(resF);
out(resM);
return 0;
}
/*
6
F 1 4:1
F 2 1:3 4:10
F 2 4:2 2:2
M 2 5:1 3:2
M 2 2:2 6:2
M 2 3:1 2:5
2 3
4
*/