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;
}
posted @ 2024-03-28 12:39  YuKiCheng  阅读(49)  评论(0编辑  收藏  举报