PAT甲级1139 First Contact (30 分):[C++题解] 图论、暴力枚举两个点、hash映射
文章目录
- 题目分析
- 题目链接
题目分析
来源:acwing
题目分析:
图论模拟题。
给定暗恋的两个人A 和B,需要寻找一对C 和D ,满足:A和C是朋友,C和D是朋友,D和B是朋友。而且A、C同性别,B、D同性别。题目给的暗恋:可能是异性(男对女,或者女对男),也可能是同性暗恋同性。
数据不大,枚举即可。只要建好图标记好边g[N][N],然后直接暴力枚举即可
for(auto c :a的同性别阵营 )for(auto d : b的同性别阵营)if( c != a && c != b && d != a && d != b && g[a][c] && g[c][d] && g[d][b] )res.push_back({c , d});
题目的难点之一在于给定的不是数字,而是字符串,因为0000 和 -0000表示男生 和女生,不能单纯从数字上来看,所以用字符串来存,这样的话,需要做一个从字符串到数字的映射,需要使用hash表。输出的时候还需要输出字符串(不需要输出表示女生的负号),因此还需要数字和字符串的逆映射,需要不停地处理输入输出。
第二个难点是枚举的时候需要按照性别枚举,这时候男生和女生需要分别存。
STL语法点补充:
下面使用了vector的去重,使用方法erase()
和uniue()
.
vector<int> boys;
boys.erase( unique(boys.begin(),boys.end()), boys.end() );
上面的代码是对数组boys进行删除重复元素。
还用到了STL中的hash table unordered_map<string,int > mp;
实现从字符串到数字的映射。使用方法count()
判断是否已经映射过。如果mp.count(x) == 0
表示还没有映射过。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 310;int n, m;
bool g[N][N];
string num[N];
unordered_map<string,int > mp;
int id ;
vector<int> boys, girls;
int main(){cin >> n >> m;while(m--){string a, b;cin >> a >> b;string x =a ,y =b;if(x.size()==5) x =x.substr(1);if(y.size() ==5) y = y .substr(1);//没出现过,映射成全新的数if(mp.count(x) == 0) mp[x] = ++id,num[id] = x;//原来的编号是什么if(mp.count(y) == 0) mp[y] = ++id, num[id] = y;int px= mp[x] ,py = mp[y];//之间有边g[px][py] = g[py][px] = true;if(a[0] != '-') boys. push_back(px);else girls.push_back(px);if(b[0] != '-' ) boys. push_back(py);else girls.push_back(py);}sort(boys.begin(),boys.end());//删除重复元素boys.erase(unique(boys.begin(),boys.end()), boys.end());sort(girls.begin(),girls.end());//删除重复元素girls.erase(unique(girls.begin(),girls.end()), girls.end());int k ;cin >> k;//询问while(k--){vector<pair<string,string>> res; //存结果string x, y;cin >> x >> y;//判断是男孩还是女孩vector<int> p= boys, q = boys;if(x[0] == '-') p =girls, x = x. substr(1);if( y[0] == '-') q = girls, y = y.substr(1);int a = mp[x] ,b = mp[y];//图的遍历//找两个点for(int c: p) //c从a的性别里找for(int d : q){ //d从b的性别里找if( c !=a && c !=b && d!= a && d!= b && g[a][c] && g[c][d] && g[d][b])res.push_back({num[c],num[d]});}cout<< res.size()<<endl;sort(res.begin(),res.end());for( auto p :res ) cout << p.first <<" "<< p.second <<endl;}}
题目链接
PAT甲级1139 First Contact (30 分)
PAT甲级1139 First Contact (30 分):[C++题解] 图论、暴力枚举两个点、hash映射相关推荐
- PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 所有的dist[ ]都≤Ds:最小的dist[ ]最大; dist[ ] 总和最大. 由于加油站是字符,为了简单起见,将m个加油站编 ...
- PAT甲级1155 Heap Paths (30 分):[C++题解]堆、堆的遍历、树的遍历、dfs输出路径、完全二叉树建树
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 堆首先是完全二叉树,所以先建完全二叉树,由于给定的是层序遍历的数据,所以直接用数组即可,注意数组下标从1开始,这样便满足结点u和左儿 ...
- PAT甲级1107 Social Clusters (30 分):[C++题解]并查集,爱好、人数
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 凭爱好,分人群.注意点:爱好可传递.什么意思?意思是A和B的有共同爱好1, B和C有共同爱好2,那么认为A和C也是同一群人. 按照爱 ...
- PAT甲级1103 Integer Factorization (30 分):[C++题解]背包问题,DP解法
文章目录 题目分析 题目链接 题目分析 分析 把N(样例中N=169)看成背包的体积:把k(样例中k=5)看成背包能承的重量.把这道题转化为二维完全背包问题.由于数据范围给出的次幂P∈[2,7],那么 ...
- PAT甲级1049 Counting Ones (30 分):[C++题解]统计1的个数、数位统计
文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析: 以数字abcdefg这个7位数字为例,说一下本题的思路. 1)数字1在每一位出现的次数. 2)以第d位为例,第d位的取值可以分为3种情 ...
- PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!
文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...
- PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:dijkstra求单源最短路的题目. 只是写两遍而已,第一遍求按照路径长度求,第二遍按照时间最少求. 另外加一个vector路径的判断 ...
- PAT甲级1030 Travel Plan (30分):[C++题解]dijkstra求单源最短路、保存路径
文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析 dijkstra模板默写过来,然后多了一个保存路径,使用数组pre[N]记录最短路上每个点的前驱,通过pre数组保存到vector中 v ...
- PAT甲级1004 Counting Leaves (30分):[C++题解]树、邻接表存储树、dfs遍历树
文章目录 题目分析 题目链接 题目分析 题意重述:一棵树,求每一层的叶子节点数目. 分析 构造树,使用邻接表来存(相当于存储有向图). 需要一个头结点数组h[N],然后每个头节点往外形成一个单链表e[ ...
最新文章
- pom war jar的区别
- echo和print 的区别
- Intel 酷睿i5 6300HQ与Intel 酷睿i7 6700HQ哪个好
- 小电商的延时队列设计概要
- psycopg2.errors.UndefinedTable: relation “xxxx“ does not exist
- 信息学奥赛C++语言:派送蛋糕
- 直流电机PID调节——P
- 中国金属复合开关设备市场趋势报告、技术动态创新及市场预测
- “再见,Linux!”
- 解决“此图片来自微信公众平台未经允许不可引用”的方法
- MVC5发展历程,从MVC2谈起
- 微信公众号推送模板消息(二):Access_token的获取
- 键值数据库的基本架构
- 使用conda安装pytorch时出现问题CondaSSLError: OpenSSL appears to be unavailable on this machine.
- 计算机专业考研复习要点,2017年最新考研各科目复习要点
- 计算机服务器安装系统安装教程,服务器如何安装系统,教您如何安装
- php网页地图上自定义,如何添加在线自定义地图
- 计算机结构化面试万能套话,结构化面试30句万能套话拯救你.pdf
- UI线程与子线程通信示例 日记
- 垃圾分类共享网站的设计与实现(SSM)