L2-044 大众情人
用Floyd求出所有人的最短路径存入 a[ i ][ j ]
求出每个女性,每个男性对她的最近距离的最远距离存入c[ i ]
输出女性b[ i ]的最小值的女性编号
同理输出男性编号
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=510,MOD=510000000;
int a[N][N],b[N],c[N];//c[N]存性别
int main()
{
int i,j,k,n,flag;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=MOD;//初始化距离必须大于500*1000000
for(i=1;i<=n;i++)
{
char c1;
getchar();
scanf("%c %d",&c1,&k);
if(c1=='F') b[i]=1;//b[i]==1是男性
if(k!=0)
{
while(k--)
{
int a1,a2;
scanf("%d:%d",&a1,&a2);
a[i][a1]=a2;//存入距离
}
}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
for(i=1;i<=n;i++)
{
c[i]=0;
for(j=1;j<=n;j++)
{
if(b[i]==b[j]) continue;
c[i]=max(c[i],a[j][i]);//c[i]存异性对他的最远距离
}
}
int man,wom;
man=wom=MOD;//初始化
for(i=1;i<=n;i++)
{
if(b[i]) man=min(man,c[i]);//男
else wom=min(wom,c[i]);//女
}
flag=1;
for(i=1;i<=n;i++)
{
if(b[i]==0) continue;
if(c[i]==man&&flag) printf("%d",i),flag--;//输出格式
else if(c[i]==man) printf(" %d",i);
}
printf("\n");
flag=1;
for(i=1;i<=n;i++)
{
if(b[i]) continue;
if(c[i]==wom&&flag) printf("%d",i),flag--;//输出格式
else if(c[i]==wom) printf(" %d",i);
}
return 0;
}