因为数据量很小,所以可以直接floyd
注意是单向边,就是说 g[i][j] 和 g[j][i] 是不一样的
需要注意的地方在注释中已给出
dij太麻烦了,应该要整一个二维数组。因为进行n次dij的时候,i对j,而不是异性对i的。
所以需要把所有的距离弄出来之后,再去再判断,不想写了orz
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <vector>
#include<cmath>
#include<stack>
#define IOS 对jios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
using namespace std;
const int maxx = 1e4 + 5;
const int maxn = 1e6 + 5;
#define N 10000100
#define ll long long
#define endl '\n'
const ll mod = 998244353;
#define test printf("--------------------------\n");
#define re(a) memset((a), 0, sizeof((a)))
#define remax(a) memset((a), 0x3f3f3f3f, sizeof((a)))
#define PII pair<int, int>
int g[510][510];
bool vis[510];//男0女1
int main() {
IOS;
int n;
cin >> n;
remax(g);
for (int i = 1; i <= n; ++i)
g[i][i] = 0;
for (int y = 1; y <= n; ++y)
{
char c;
int k;
cin >> c >> k;
if (c == 'F')
vis[y] = true;
for (int i = 0; i < k; ++i)
{
string s;
int a, b;
cin >> s;
sscanf(s.c_str(), "%d:%d", &a, &b);
g[y][a] = b;//注意这里,不是双向的,当时一直处理成双向
}
}
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]);
}
}
}
vector<PII> vf;
vector<PII> vm;
for (int i = 1; i <= n; ++i){
if(vis[i]){//女性
int res = -0x3f3f3f;
for (int j = 1; j <= n; ++j){
if(!vis[j]){
if(g[i][j] != 0x3f3f3f)
res = max(res, g[j][i]);//这里也需要注意
}
}
if(res != -0x3f3f3f)
vf.push_back({res, i});
}
else{
int res = -0x3f3f3f;
for (int j = 1; j <= n; ++j){
if(vis[j]){
if(res != 0x3f3f3f)
res = max(res, g[j][i]);
}
}
if(res != -0x3f3f3f)
vm.push_back({res, i});
}
}
sort(vf.begin(), vf.end());
sort(vm.begin(), vm.end());
int pre = -1;
vector<int> ans;
for(auto w : vf){//这里也可以直接输出,但我不想调格式了,所以再创了个ans放答案
if(pre == -1 || pre == w.first){
ans.push_back(w.second);
}
else
break;
pre = w.first;
}
pre = -1;
for (int i = 0; i < ans.size(); ++i){
if(i == 0)
cout << ans[0];
else
cout << " " << ans[i];
}
cout << endl;
ans.clear();
for (auto w : vm)
{
if (pre == -1 || pre == w.first){
ans.push_back(w.second);
}
else
break;
pre = w.first;
}
for (int i = 0; i < ans.size(); ++i){
if(i == 0)
cout << ans[0];
else
cout << " " << ans[i];
}
return 0;
}