团体程序设计天梯赛
L2-044 大众情人
多源最短路径求“距离感”。之后遍历所有人,分别求两个最小最大值。
#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 510, INF = 0x3f3f3f3f;
bool sx[N]; // 性别,0:female, 1:male
int g[N][N]; // 邻接矩阵
int resf[N], resm[N], cntf, cntm;
void floyd(){
for(int k = 1; k <= n; k ++){
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++){
if(i != j) g[i][j] = min(g[i][k] + g[k][j], g[i][j]);
}
}
}
}
int main(){
memset(g, 0x3f3f, sizeof g);
scanf("%d\n", &n);
for(int i = 1; i <= n; i ++){
char ch;
int k;
scanf("%c %d", &ch, &k);
if(ch == 'M') sx[i] = true;
for(int j = 1; j <= k; j ++){
int id, dist;
scanf("%d:%d", &id, &dist);
g[i][id] = dist;
}
getchar();
}
floyd();
int minmaxm2f = INF, minmaxf2m = INF;
for(int i = 1; i <= n; i ++){ // 遍历所有人
if(sx[i]){ // male
int maxe = -1;
for(int j = 1; j <= n; j ++) if(!sx[j] && g[j][i] > maxe) maxe = g[j][i];
if(maxe < minmaxf2m) minmaxf2m = maxe, resm[cntm = 1] = i;
else if(maxe == minmaxf2m) resm[++ cntm] = i;
}
else{ // female
int maxe = -1;
for(int j = 1; j <= n; j ++) if(sx[j] && g[j][i] > maxe) maxe = g[j][i];
if(maxe < minmaxm2f) minmaxm2f = maxe, resf[cntf = 1] = i;
else if(maxe == minmaxm2f) resf[++ cntf] = i;
}
}
for(int i = 1; i <= cntf; i ++) cout << resf[i] << " \n"[i == cntf];
for(int i = 1; i <= cntm; i ++) cout << resm[i] << " \n"[i == cntm];
return 0;
}