L2-044 大众情人
测试点4一开始没过去,以为是数据范围的问题。
找半天才发现是floyd三层循环k那个写反了,害。
#include <bits/stdc++.h>
using namespace std;
vector<int> male,female;
int dis[510][510];
int main() {
memset(dis, 0x3f, sizeof(dis));
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
char sex;
int cnt, person, distance;
cin >> sex;
cin >> cnt;
if (sex == 'F') female.push_back(i);
else male.push_back(i);
while (cnt--) {
cin >> person;
cin.get();
cin >> distance;
dis[i][person] = distance;
}
}
for (int k = 1; k <= n; k++) {//支点
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dis[i][j] = min(dis[i][k] + dis[k][j], dis[i][j]);
}
}
}
set<int> ans1, ans2;
int dis1 = INT_MAX,dis2=INT_MAX;
//女生的大众情人
for (int i = 0; i < male.size(); i++) {
int man = male[i];
int distance = 0;
for (int j = 0; j < female.size(); j++) {//所有的女生对man的距离感
if (dis[female[j]][man] > distance) {
distance = dis[female[j]][man];
}
}
//distance是这个和这个男生关系最远的女生的距离
if (distance < dis1) {
dis1 = distance;
ans1.clear();
ans1.insert(man);
}
else if (distance == dis1) {
ans1.insert(man);
}
}
//男生的大众情人
for (int i = 0; i < female.size(); i++) {
int woman = female[i];
int distance = 0;
for (int j = 0; j < male.size(); j++) {
if (dis[male[j]][woman] > distance) {
distance = dis[male[j]][woman];
}
}
if (distance < dis2) {
dis2 = distance;
ans2.clear();
ans2.insert(woman);
}
else if (distance == dis2) {
ans2.insert(woman);
}
}
set<int>::iterator it;
for (it = ans2.begin(); it != ans2.end();) {
cout << *it;
if (++it != ans2.end()) {
cout << " ";
}
}
cout << '\n';
for (it = ans1.begin(); it != ans1.end();) {
cout << *it;
if (++it != ans1.end()) {
cout << " ";
}
}
return 0;
}