PAT 甲级 1139 First Contact (30 分)
思路:
1.用大数组记录两个人之间是否有关系;
2.用vector记录某人认识的所有人;
3.用一个全局变量保存0000这个人是男还是女(因为id的绝对值是unique的)
4.a喜欢b,使用两层循环遍历a和b认识的每一个人。假设a认识c、b认识d,(a、c需要是同性 & b、d也要是同性 & a不能是d & c不能是b);
5.输出使用%04d;
代码:
#include<iostream>
#include<vector>
#include<unordered_map>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
bool rela[9999][9999];
int sym=-1;
unordered_map<int,vector<int>> mp;
bool cmp(const pair<int,int> & a,const pair<int,int> & b){
return a.first==b.first?a.second<b.second:a.first<b.first;
}
bool iss(int a,int b){
if(a==0||b==0) return a==0?(sym^b)>0:(a^sym)>0;
else return (a^b)>0;
}
int main(){
int n,m,k;
cin>>n>>m;
for(int i=0;i<m;i++){
string s1,s2;
cin>>s1>>s2;
if(s1=="0000"||s2=="0000") sym=1;
int f1=atoi(s1.c_str());
int f2=atoi(s2.c_str());
mp[f1].push_back(f2);
mp[f2].push_back(f1);
rela[abs(f2)][abs(f1)]=rela[abs(f1)][abs(f2)]=true;
}
cin>>k;
for(int i=0;i<k;i++){
int a,b;
cin>>a>>b;
vector<pair<int,int>> v;
for(auto j:mp[a])
for(auto k:mp[b])
if(j!=b&&k!=a&&rela[abs(j)][abs(k)]&&iss(b,k)&&iss(a,j))
v.push_back(make_pair(abs(j),abs(k)));
printf("%d\n",v.size());
sort(v.begin(),v.end(),cmp);
for(auto e:v)
printf("%04d %04d\n",e.first,e.second);
}
return 0;
}