**

题意:每两个人眼中之间的距离是不相同的,现在有n个,找出其他异性人中对他的最远距离,然后分别在男性和女性中找出最小的《最远距离》。可以有多个人。

题解: 用floyd算法,多源汇最短路。求出每个人间的最短距离,然后对每个人进行遍历,找出该人的最远距离。然后再遍历一次找出最小值。输出。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 550;
int g[N][N];
int d[N];
int sex[N];

int main()
{
	int n;
	cin>>n;
	memset(g,0x3f,sizeof g);//用floyd时一定要初始化
	for(int i=1;i<=n;i++)g[i][i]=0; //可有可无
	
	for(int i=1;i<=n;i++){
		char c;int k;
		scanf(" %c %d",&c,&k);
		if(c=='F')sex[i]=1;//nv
		else sex[i] = 2;//nan
		
		while(k--){
			int b,c;
			scanf("%d:%d",&b,&c);
			g[i][b] = c;
		}
	}
	
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				g[i][j] = min(g[i][j],g[i][k]+g[k][j]);
			}
		}
	}
	
	//异性缘为女到男最大的距离分之一
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(sex[i]!=sex[j])
				d[i] = max(d[i],g[j][i]);
		}
	} 
	
	
	int d1 = 0x3f3f3f3f,d2=0x3f3f3f3f;//d1 nan d2 nv
	for(int i=1;i<=n;i++){
		if(sex[i]==1)d2 = min(d2,d[i]);
		else d1 = min(d1,d[i]);
	}
	
	vector<int> a,b;
	
	for(int i=1;i<=n;i++)
	{
		if(d[i]==d1 && sex[i]==2)
			b.push_back(i);
		else if(d[i]==d2 && sex[i]==1 )
			a.push_back(i);
	}
	cout<<a[0];
	for(int i=1;i<a.size();i++)
		cout<<" "<<a[i];
		
	cout<<endl<<b[0];
	for(int i=1;i<b.size();i++)
		cout<<" "<<b[i];
		
	
	
	
}