思路:
这题题面实在是太恶心了。这题的要我们求的其实是
异性缘最大值==同性别中max(1/max(该人到一位异性的距离d[i][j])),然后我们先枚举内层找到内层的max,然后再枚举外层找到外层的max即可。
而对于max(d[i][j])里面的d[i][j]肯定是越小越好(因为我们要取倒数),所以我们要搞最短路
当然我们经过分析之后,先找最短路,然后再对同性群体中每个人与异性距离感最大值里面取个最小值,因此我们就不用取倒数了。
然后这题最坑的是,他给你的距离是你对别人的距离感,也就是后面我们要找回去的时候是用别人对你的。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 510;
int dis[510][510];
int n;
unordered_set<int> fm,m;
struct node{
int val;
int num;
}a[510];
bool cmp(node x, node y){
if(x.val==y.val) return x.num<y.num;
return x.val<y.val;
}
int main(){
//ios::sync_with_stdio(false);
//cin.tie(0),cout.tie(0);
cin >> n;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(i==j) dis[i][j]=0;
else dis[i][j]=0x3f3f3f3f;
}
}
for(int i=1; i<=n; i++){
char sex;
int mx;
cin >> sex >> mx;
if(sex=='F') fm.insert(i);
else m.insert(i);
while(mx--){
int a,b;
scanf("%d:%d",&a,&b);
dis[i][a]=min(dis[i][a],b);
}
}
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
// for(int i=1; i<=n; i++){
// for(int j=1; j<=n; j++){
// cout << dis[i][j] << " ";
// }
// puts("");
// }
//female
int cnt=0;
for(auto i:fm){
int maxx=0;
for(auto j:m){
if(maxx<dis[j][i]){
maxx=dis[j][i];
}
}
a[++cnt].val=maxx;
a[cnt].num=i;
}
sort(a+1,a+1+cnt,cmp);
for(int i=1; i<=cnt; i++){
if(a[i].val==a[1].val){
if(i!=1) cout << " ";
cout << a[i].num;
}
}
puts("");
//male
cnt=0;
for(auto i:m){
int maxx=0;
for(auto j:fm){
if(maxx<dis[j][i]){
maxx=dis[j][i];
}
}
a[++cnt].val=maxx;
a[cnt].num=i;
}
sort(a+1,a+1+cnt,cmp);
for(int i=1; i<=cnt; i++){
if(a[i].val==a[1].val){
if(i!=1) cout << " ";
cout << a[i].num;
}
}
return 0;
}