这道题简单使用了一下Floyd算法,之后在更新的最值中找出每个人对应的最大距离数,之后按这个最大距离数保存对应男女生即可具体讲解如下
#include<bits/stdc++.h>
using namespace std;
int sex[510];//当前人的性别
int maps[510][510];//临界矩阵
int dps[510];//每个人最大距离数
int main()
{
int a;cin>>a;//输入人数
memset(maps,0x3f,sizeof(maps));//两个数组始初化
memset(sex,-1,sizeof(sex));
int num;
char t;
for(int i=1;i<=a;i++)
{ cin>>t;//是否男女
cin>>num;//有关系人的数目
if(t=='M')sex[i]=1;
else if(t=='F')sex[i]=0;
for(int i1=1;i1<=num;i1++)
{
int a1;
char b;
int c;
cin>>a1>>b>>c;
maps[i][a1]=c;//单向图
}
}
//Floyd保存最优距离
for(int i1=1;i1<=a;i1++)
{
for(int i2=1;i2<=a;i2++)
{
for(int i3=1;i3<=a;i3++)
{
maps[i2][i3]=min(maps[i2][i3],maps[i2][i1]+maps[i1][i3]);
}
}
}
for(int i=1;i<=a;i++)//将每个人对应的最大距离数保存下来
{
for(int i1=1;i1<=a;i1++)
{
if(i!=i1&&sex[i]^sex[i1])
{
dps[i]=max(dps[i],maps[i1][i]);
}
}
}
vector<int>p(510);//最后就是找出那个最大的距离数的人并进行保存
int mas=0x3f3f3f3f;
int xu=0;
for(int i=1;i<=a;i++)
{
if(sex[i]==0&&mas>dps[i])
{
mas=dps[i];
p[0]=i;xu=1;
}
else if(sex[i]==0&&mas==dps[i])
{
p[xu++]=i;
}
}
cout<<p[0];
for(int i=1;i<xu;i++)cout<<" "<<p[i];
cout <<"\n";
mas=0x3f3f3f3f;
xu=0;
for(int i=1;i<=a;i++)
{
if(sex[i]==1&&mas>dps[i])
{
mas=dps[i];
p[0]=i;xu=1;
}
else if(sex[i]==1&&mas==dps[i])
{
p[xu++]=i;
}
}
cout<<p[0];
for(int i=1;i<xu;i++)cout<<" "<<p[i];
}