-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBZ1196.cpp
65 lines (60 loc) · 981 Bytes
/
BZ1196.cpp
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
#include <cstdio>
#pragma warning (disable : 4996)
struct
{
int a, b, c1, c2;
}e[20001];
int fa[10001], n, k, m;
inline void reset()
{
for (int i = 1; i <= n; i++)
fa[i] = i;
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
inline bool check(int x)
{
int cnt = 0;
reset();
for (int i = 1; i <= m; i++)
if (e[i].c1 <= x)
{
int p = find(e[i].a), q = find(e[i].b);
if (p != q)
{
fa[p] = q;
cnt++;
}
}
if (cnt < k) return 0;
reset();
cnt = 0;
for (int i = 1; i <= m; i++)
if (e[i].c2 <= x)
{
int p = find(e[i].a), q = find(e[i].b);
if (p != q)
{
fa[p] = q;
cnt++;
}
}
return cnt == n - 1;
}
int main()
{
scanf("%d%d%d", &n, &k, &m);
for (int i = 1; i < m; i++)
scanf("%d%d%d%d", &e[i].a, &e[i].b, &e[i].c1, &e[i].c2);
int l = 1, r = 30000, ans = r;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
printf("%d", ans);
return 0;
}