-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2018-12-T4.cpp
79 lines (76 loc) · 1.31 KB
/
2018-12-T4.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
* Topic: CSP-2018-12-CIDR合并
* Author: Bao Wenjie
* Email: [email protected]
* Date: 2020/8/19
*/
#include <iostream>
#include <algorithm>
#define MAX_EDGE 100010
#define MAX_VETEX 50010
struct Edge {
int v;
int u;
int t;
};
struct Edge edge[MAX_EDGE];
int vertex[MAX_VETEX];
using namespace::std;
// 运算符重载
bool operator < (struct Edge& a, struct Edge& b);
// 并查集
int find(int x, int vertex[]);
int main()
{
// 读入数据
int n, m, root;
int v, u, t;
scanf_s("%d%d%d", &n, &m, &root);
for (int i(0); i < m; i++)
{
scanf_s("%d%d%d", &(edge[i].v), &(edge[i].u), &(edge[i].t));
}
// 初始化:给edge排序
memset(vertex, 0, sizeof(int) * MAX_VETEX);
sort(edge, edge + m);
for (int i(0); i <= n; i++)
vertex[i] = i;
// kruskal算法
int maxValue = 0;
for (int i(0); i < m; i++)
{
if (find(edge[i].v, vertex) != find(edge[i].u, vertex))
{
if (maxValue < edge[i].t)
maxValue = edge[i].t;
vertex[find(edge[i].u, vertex)] = find(edge[i].v, vertex);
}
}
printf_s("%d\n", maxValue);
}
/**
* 运算符重载
*/
bool operator < (struct Edge& a, struct Edge& b)
{
return (a.t < b.t);
}
/**
* 并查集
*/
int find(int x, int vertex[])
{
int tmp = x;
while (tmp != vertex[tmp])
{
tmp = vertex[tmp];
}
// 压缩路径
while (tmp != x)
{
int last = vertex[x];
vertex[x] = tmp;
x = last;
}
return tmp;
}