PAT 1139. First Contact (30)-PAT甲级真题

思路参考:From柳神
一开始没考虑到(2、4)参考柳神的注意点后修改的代码。
1.用unordered_map<string, set > mp来表示邻接表(使用unordered_map比map时间复杂度小,不过使用map也可以AC)
2.A在寻找同性朋友时,需要避免找到他想要的伴侣B,所以当当前朋友就是B或者B的同性朋友就是A时舍弃该结果
3.输出时候要以4位数的方式输出,所以要%04d
4.如果用int接收一对朋友,-0000和0000对于int来说都是0,将无法得知这个人的性别,也就会影响他找他的同性朋友的那个步骤,所以考虑用字符串接收,因为题目中已经表示会以符号位加四位的方式给出输入,所以只要判断字符串是否大小相等,如果大小相等说明这两个人是同性(所以用string来存储邻接表中的元素)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<unordered_map>
using namespace std;
int n, m,k;
unordered_map<string, set<string> > mp;
struct friends{
	int a, b;
	friends(int _a, int _b):a(_a),b(_b){};
};
vector<friends> v;
bool cmp(friends a,friends b){
	if (a.a != b.a) return a.a < b.a;
	return a.b < b.b;
}
int main(){
	scanf("%d%d", &n, &m);
	string str1, str2;
	int flag=1;
	for (int i = 0; i < m; ++i){
		cin >> str1 >> str2;
		mp[str1].insert(str2);
		mp[str2].insert(str1);
	}
	scanf("%d", &k);
	for (int i = 0; i < k; ++i){
		v.clear();
		cin >> str1 >> str2;
		if (mp.find(str1) != mp.end()&&mp.find(str2)!=mp.end()){
			for (auto it=mp[str1].begin(); it!=mp[str1].end(); ++it){
				if (str1.size()==(*it).size()&& (*it)!=str2){
					for (auto it2=mp[str2].begin();it2!=mp[str2].end(); ++it2){
						if (str2.size()==(*it2).size()&& *it2!=str1 && mp[(*it2)].find(*it) != mp[(*it2)].end()){
							v.push_back(friends(abs(stoi(*it)), abs(stoi(*it2))));
						}
					}
				}
			}
		}
		sort(v.begin(), v.end(), cmp);
		printf("%d\n", v.size());
		for (int i = 0; i < v.size(); ++i){
			printf("%04d %04d\n", v[i].a, v[i].b);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值