pat甲级1139 First Contact (测试点5超时进来看)

文章描述了一种编程题目的解决方案,该题目涉及通过朋友关系传递消息。题目要求在给定的同性别朋友网络中,找出A通过同性别的朋友C传递消息到B的路径,同时考虑了输入异常、自我循环和效率优化等问题。解决方案使用了哈希表优化查找过程,并避免了重复路径。
摘要由CSDN通过智能技术生成

题目大意:A喜欢B,但是A不会直接找B,A要找他的朋友且同性别的C,然后C去找和B的朋友且同性别的D,让D去联系B,给定 A和B,求C和D有哪些

这题目坑有点多

1.输入有可能有0000和-0000出现,所以不能用相乘是否大于0判断是否同性别

2.遍历A的朋友的时候,C可能是B,同理D可能是A,这俩中情况要排除

3.暴力写最后一个测试点会超时,需要用hash表来判断俩人是否是朋友(经典空间换时间)

4.输出的时候要 "%04d"

hash表的计算公式有很多,我的只是其中一种,只要不会重复都可以,我们这个公式为什么不会重复,是因为每个人的id是不同的,然后把id看成数字,则id*10000 = id0000,因为id不同,则(A的id0000)和(B的id0000)肯定不同,所以就不会出现A和B是朋友,A和C是朋友但key值相同。

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e4 + 10 ;
const ll inf = 0x3f3f3f3f ;
const ll mod = 12345678901 ;
unordered_map<int , int > mp ;
vector<int > g[10000] ;
void deal(){
	int n , m ; cin >> n >> m ; 
	for(int i = 0 ; i < m ; i++){
		string u , v ; cin >> u >> v ;
		//只存同性别的人 
		if(u.size() == v.size()){//stoi(u) * stoi(v) < 0不能这么写,有可能有+0或-0 
			g[abs(stoi(u))].push_back(abs(stoi(v))) ;
			g[abs(stoi(v))].push_back(abs(stoi(u))) ;
		}
		//hash表来判定俩个人有没有关系
		mp[abs(stoi(u)) * 10000 + abs(stoi(v))] = mp[abs(stoi(v)) * 10000 + abs(stoi(u))] = 1 ;
	}
	int k ; cin >> k ;
	for(int i = 0 ; i < k ; i++){
		int u , v ; cin >> u >> v ;
		u = abs(u) ;
		v = abs(v) ;
		vector<pair<int , int > > ans ;
		for(int j = 0 ; j < g[u].size() ; j++){//A朋友 = C
			for(int l = 0 ; l < g[v].size() ; l++){//B朋友 = D
				//需要排除C是v或D是u 的情况 
				if(g[u][j] == v || g[v][l] == u) continue ;
				if(mp[g[u][j] * 10000 + g[v][l]]) {//只用写一个,避免重复 
					ans.push_back({g[u][j] , g[v][l]}) ;
				}
			} 
		}
		sort(ans.begin() , ans.end()) ;
		cout << ans.size() << endl ;
		for(int j = 0 ; j < ans.size() ; j++){
			printf("%04d %04d\n" , ans[j].first , ans[j].second) ;
		}
	}
}
int main(){
    deal() ;
    return 0 ;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值