【题解】【AcWing】1632. 第一次接触

106 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1632. 第一次接触

原题传送:AcWing 1632. 第一次接触

与如今不同,早年男孩和女孩表达爱情的方式相当微妙。

当男孩 AA 暗恋着女孩 BB 的时候,他通常不会直接与她联系。

取而代之的是,他可能会去找另一个男孩 CC (他的好朋友)去拜托女孩 DD (她是 BBCC 的朋友)将女孩 BB 约出来。

这实在是麻烦不是吗?

女孩也会做类似的事情。

在给定的友谊关系网络中,请你帮助一些男孩和女孩列出所有可能会帮助他们进行第一次联系的朋友。

输入格式

第一行包含两个整数 NNMM ,分别表示总人数以及友好关系的数量。

接下来 MM 行,每行给出一对朋友关系。

每个人都用一个 44 位数字表示,为了区分性别,我们在女生的编号前加了负号。

再一行包含一个整数 KK ,表示询问数量。

接下来 KK 行,每行包含一对暗恋关系,假设第一个人暗恋着第二个人。

输出格式

对于每组询问,第一行输出一个整数,表示可以找到的帮忙牵线的不同朋友对的数量。

然后,在每行输出一对帮忙的朋友的编号。

如果 AABB 的性别不同,则先输出与 AA 性别相同的朋友,再输出与 BB 性别相同的朋友。

如果 AABB 的性别相同,则两个朋友的性别必须也和他们相同。

保证每个人只有一种性别。

一组询问内,朋友对按第一个朋友的编号从小到大进行排序,第一个朋友的编号相同时,按第二个朋友的编号从小到大进行排序。

数据范围

1<N3001<N \le 300 , 1M150001 \le M \le 15000 , 1K1001 \le K \le 100

输入样例:

10 18
-2001 1001
-2002 -2001
1004 1001
-2004 -2001
-2003 1005
1005 -2001
1001 -2003
1002 1001
1002 -2004
-2004 1001
1003 -2002
-2003 1003
1004 -2002
-2001 -2003
1001 1003
1003 -2001
1002 -2001
-2002 -2003
5
1001 -2001
-2003 1001
1005 -2001
-2002 -2004
1111 -2003

输出样例:

4
1002 2004
1003 2002
1003 2003
1004 2002
4
2001 1002
2001 1003
2002 1003
2002 1004
0
1
2003 2001
0

思路:

将输入的男生和女生序号进行映射,分别存入不同性别的vector, 从暗恋的两个人之间相同性别的vector中寻找不是自己的有友好关系的朋友,存入pair中输出。

题解:

#include <bits/stdc++.h>

using namespace std;

const int N = 310;

int n, m, id;
bool g[N][N];
string num[N];
unordered_map<string , int> mp;
vector<int> boys, girls;

int main()
{
	scanf("%d%d", &n, &m);
		
	for(int i = 0; i < m; i++)
	{
		char as[6], bs[6];
		string a, b;
		scanf("%s%s", as, bs);
		a = as, b = bs;
		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;
	scanf("%d", &k);
	
	while(k--)
	{
		vector<pair<string, string>> res;
		char as[6], bs[6];
		string x, y;
		scanf("%s%s", as, bs);
		x = as, y = bs;
		
		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)
			for(int d : q)
				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]});
		
		sort(res.begin(), res.end());
		printf("%d\n", res.size());
		for(auto item : res)
			printf("%s %s\n", item.first.c_str(), item.second.c_str());
	}
	
	return 0;
}