L2-010 排座位 (25 分)
摘要
Title: L2-010 排座位 (25 分)
Tag: 并查集
Memory Limit: 64 MB
Time Limit: 1000 ms
Powered by:NEFU AB-IN
L2-010 排座位 (25 分)
-
题意
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
-
思路
朋友用并查集维护,敌人用哈希表记录
-
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74/*
* @Author: NEFU AB-IN
* @Date: 2022-04-20 21:16:16
* @FilePath: \ACM\GPLT\L2-010.CPP
* @LastEditTime: 2022-04-20 21:38:40
*/
using namespace std;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 120;
int p[N];
unordered_map<int, unordered_map<int, int>> vis;
int find(int x)
{
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
int n, m, k;
signed main()
{
IOS;
cin >> n >> m >> k;
for (int i = 1; i <= n; ++i)
p[i] = i;
for (int i = 1; i <= m; ++i)
{
int u, v, op;
cin >> u >> v >> op;
if (op == 1)
{
p[find(u)] = find(v);
}
else
{
vis[u][v] = vis[v][u] = 1;
}
}
for (int i = 1; i <= k; ++i)
{
int u, v;
cin >> u >> v;
int f1 = find(u) == find(v);
int f2 = vis[u][v] && vis[v][u];
if (f1 && !f2)
{
cout << "No problem\n";
}
else if (f1 && f2)
{
cout << "OK but...\n";
}
else if (!f1 && !f2)
{
cout << "OK\n";
}
else
{
cout << "No way\n";
}
}
return 0;
}