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
",v.size());
		sort(v.begin(),v.end(),cmp);
		for(auto e:v)
			printf("%04d %04d
",e.first,e.second);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12309077.html