排座位 天梯

用两个vector 分别存放各自的朋友 敌人
用并查集来看是不是有共同朋友
思路较为简单

注释比较详细

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
const int MAX_N = 110;
//朋友关系图
int visited[MAX_N];
//敌人
vector<int> enemy[MAX_N];
//朋友
vector<int> frinde[MAX_N];
int find(int x)
{
	return visited[x] == x ? x : visited[x] = find(visited[x]);
}
int main()
{
	int N, M, K;
	scanf("%d%d%d", &N, &M, &K);
	//初始化
	iota(visited, visited + N, 0);
	for (int i = 0; i < M; ++i)
	{
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		if (z == 1)
		{
			frinde[x].push_back(y);
			frinde[y].push_back(x);
			int a = find(x);
			int b = find(y);
			if (a != b)
				visited[a] = b;
		}
		else
		{
			enemy[x].push_back(y);
			enemy[y].push_back(x);
		}
	}
	while (K--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		int t = 1;
		int a_1 = find(a);
		int a_2 = find(b);
		//看是不是朋友
		for (auto e : frinde[a])
		{
			if (e == b)
			{
				printf("No problem\n");
				t = 0;
				break;
			}
		}
		if (t)
		{
			//看是不是敌人
			for (auto e : enemy[a])
			{
				if (e == b)
				{
					//看有没有共同的朋友
					if (a_1 == a_2)
						printf("OK but...\n");
					else
						printf("No way\n");
					t = 0;
					break;
				}
			}
		}
		if (t)
			printf("OK\n");
	}
	return 0;
}
发布了106 篇原创文章 · 获赞 25 · 访问量 7214

猜你喜欢

转载自blog.csdn.net/weixin_45653525/article/details/104297244