L2-4 大众情人 (25 分)
输入样例:
6
F 1 4:1
F 2 1:3 4:10
F 2 4:2 2:2
M 2 5:1 3:2
M 2 2:2 6:2
M 2 3:1 2:5
输出样例:
2 3
4
当时做成了并查集,属实菜狗,一个flord直接搞定,
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N = 510;
int sex[N],n;
struct peo{
int num;
int qr=0;
bool operator<(struct peo a){
if(qr!=a.qr) return qr<a.qr;
return num<a.num;
}
}s1[N],s2[N];
bool st[N];
int g[N][N];
int cnt1,cnt2;
unordered_map<int,int>p;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)g[i][j]=0x3f3f3f3f;
for(int i=1;i<=n;i++){
char a;
int k;
cin>>a;
if(a=='M')sex[i]=1,p[i]=++cnt1,s1[cnt1].num=i;
else p[i]=++cnt2,s2[cnt2].num=i;
cin>>k;
for(int j=0;j<k;j++){
int a,b;
scanf("%d:%d",&a,&b);
g[a][i]=b;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
g[j][k]=min(g[j][k],g[j][i]+g[i][k]);
for(int i=1;i<=n;i++)
{ int flag=sex[i];
for(int j=1;j<=n;j++){
if(i!=j){
int a=sex[j];
if(a==flag)continue;
if(flag==0){
s2[p[i]].qr=max(s2[p[i]].qr,g[i][j]);
} else s1[p[i]].qr=max(s1[p[i]].qr,g[i][j]);
}
}
}
sort(s1+1,s1+cnt1+1);
sort(s2+1,s2+cnt2+1);
bool o=0;
for(int i=1;i<=cnt2;i++){
if(s2[i].qr==s2[1].qr){
if(o)cout<<" ";
o=1;
cout<<s2[i].num;
}
else break;
}
cout<<endl;
o=0;
for(int i=1;i<=cnt1;i++){
if(s1[i].qr==s1[1].qr){
if(o)cout<<" ";
o=1;
cout<<s1[i].num;
}
else break;
}
}