题意很重要
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 504;
int n;
unordered_set<int> F,M;
int head[N],net[N],e[N],w[N],cnt;
void add(int a,int b,int c)
{
e[cnt]=b,net[cnt]=head[a],w[cnt]=c,head[a]=cnt++;
}
int dist[N][N];
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
int main(){
memset(dist,0x3f,sizeof dist);
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
char gender=getchar();
assert(gender!='\n'||gender=='M'||gender=='F');
if(gender=='M')
M.emplace(i);
else
F.emplace(i);
int f_num;
scanf("%d",&f_num);
int fri,dis;
for(int j=1;j<=f_num;j++)
{
scanf("%d:%d",&fri,&dis);
dist[i][fri]=dis;
}
getchar();
}
floyd();
//只需要保存最大异性D即可,最小的是大众情人
//这个D好像是异性看他的,不是他看异性的
vector<int> M_index;int M_D=0x3f3f3f3f;
vector<int> F_index;int F_D=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
int max_D=0;
if(M.count(i))
{
for(auto op_fri:F)
max_D=max(max_D,dist[op_fri][i]);
if(max_D==M_D)
M_index.push_back(i);
if(max_D<M_D){
M_index.clear();
M_D=max_D;
M_index.push_back(i);
}
}
else
{
for(auto op_fri:M)
max_D=max(max_D,dist[op_fri][i]);
if(max_D==F_D)
F_index.push_back(i);
if(max_D<F_D){
F_index.clear();
F_D=max_D;
F_index.push_back(i);
}
}
}
for(int i=0;i<F_index.size();i++)
printf("%d ",F_index[i]);
puts("");
for(int i=0;i<M_index.size();i++)
printf("%d ",M_index[i]);
return 0;
}
CCCC L2-044