题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312
题解
题目要求
背景
男生A喜欢女孩B,A找男生C让女孩D跟B说,其中C是A的朋友,D是B和C的朋友。女生也是这样联系男生
输入
- N:人的数量,1到300
- M:朋友关系的数量
- M个朋友关系:用4位数字表示一个人,其中负数代表性别是女生
- K:查询数量,不超过100
- K次查询:每次查询是A和B的ID,假设A喜欢B
输出
输出有几对C和D可以帮助A联系B
输出这几对C和D
如果A和B是异性,则A和C应该是同性,B和D同性;如果A和B是同性,则这4人性别应该相同
即A和C同性,B和D同性
先按C的ID非降序输出,再按D的ID增序输出
思路
- 使用邻接矩阵表示两个人是否是朋友,用邻接表存储一个人的同性朋友
- 给定A和B以后,枚举A的朋友C,枚举B的朋友D,如果C和D是朋友则保存C和D
注意点
- 输出时要以4位数字输出,用
printf("%04d")
,第二和第三个测试点都测试了这个 - 如果用int接收一对朋友,-0000和0000对于int来说都是0,将无法得知这个人的性别
- 在这里我对他们的id进行了处理:把女生映射到[0,9999],男生映射到[10000,19999]
- 也可以使用其他的哈希方法
- 正常回路为A-C-D-B,不可以形成A-B-D-B或A-C-A-B的回路,即AD不相等、BC不相等
- 写循环代码时注意一些变量是否会随着循环运行而改变,比如数组大小、外层循环变量是否被内层循环改变
代码
1 | // Problem: PAT Advanced 1139 |
一份超时的代码
1 | // Problem: PAT Advanced 1139 |
参考链接
https://blog.csdn.net/liuchuo/article/details/79065004
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!