题意:当男孩 A 暗恋着女孩 B 的时候,他通常不会直接与她联系。取而代之的是,他可能会去找另一个男孩 C(他的好朋友)去拜托女孩 D(她是 B 和 C 的朋友)将女孩 B 约出来。这实在是麻烦不是吗?女孩也会做类似的事情。在给定的友谊关系网络中,请你帮助一些男孩和女孩列出所有可能会帮助他们进行第一次联系的朋友
注意: 可以是同性恋(即AB性别相同);不可以无中生友(即我就是我自己的朋友,A!=C,B!=D);不可以直接对朋友下手(即A!=D&&B!=C);需要按第一个朋友的编号从小到大进行排序,第一个朋友的编号相同时,按第二个朋友的编号从小到大进行排序。
思路:首先对编号进行离散化,这样一来就可以用邻接矩阵存储朋友关系。
根据性别丢到两个set里,这样就不用手动去重排序啦
对于每个询问,先判断A和B的性别,然后两重循环对应同性,找出里是朋友关系且满足上述条件的两个电灯泡,存下来再排序输出。
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=300+233;
const int M=2e5+5;
int n,m,k;
set<int>boys,girls;
string num[N];
unordered_map<string,int> mp;
int id;
int g[N][N];
int main(){
cin>>n>>m;
while(m--){
string a,b;
cin>>a>>b;
string x=a,y=b;
if(a[0]=='-') x=x.substr(1);
if(b[0]=='-') y=y.substr(1);
if(mp.count(x)==0) mp[x]=++id,num[id]=x;
if(mp.count(y)==0) mp[y]=++id,num[id]=y;
int px=mp[x],py=mp[y];
g[px][py]=g[py][px]=1;
if(a[0]=='-') girls.insert(px);
else boys.insert(px);
if(b[0]=='-') girls.insert(py);
else boys.insert(py);
}
int k;cin>>k;
while(k--){
string x,y;
set<int>p=boys,q=boys;
vector<pair<string,string>>res;
cin>>x>>y;
if(x[0]=='-') x=x.substr(1),p=girls;
if(y[0]=='-') y=y.substr(1),q=girls;
int a=mp[x],b=mp[y];
for(auto c:p){
for(auto d:q){
if(c!=a&&c!=b&&d!=b&&d!=a&&g[a][c]&&g[c][d]&&g[d][b])
res.push_back({num[c],num[d]});
}
}
cout<<res.size()<<endl;
sort(res.begin(),res.end());
for(auto ans:res) cout<<ans.first<<" "<<ans.second<<endl;
}
}