题意
样例:
INPUT:
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
OUTPUT:
4
思路
总结
- 此处应用并查集应该使用路径压缩的树并查集,如果使用数组描述的并查集会导致超时;
- 其次由于数据范围很大,使用scanf进行输入,节省输入时间;
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct nums
{
int v1;
int v2;
int edge;
bool operator<(const nums& p)
{
return edge < p.edge;
}
nums& operator=(const nums& p)
{
v1 = p.v1;
v2 = p.v2;
edge = p.edge;
return *this;
}
};
int n, m,root,count1 = 0, max1=0;
int a[500010];
void init()
{
for (int i = 1; i < n + 3; i++)
a[i] = i;
}
int find(int x)
{
if(a[x]==x)
return x;
return a[x]=find(a[x]);
}
bool unite(int x, int y)
{
x=find(x);
y=find(y);
if(x==y)
return false;
a[x]=y;
return true;
}
void max_w(struct nums* edge1)
{
sort(edge1, edge1 + count1);
init();
int c = 0;
for (int i = 0; i < count1; i++)
{
struct nums temp = edge1[i];
if (unite(edge1[i].v1,edge1[i].v2))
{
if (edge1[i].edge > max1)
max1 = edge1[i].edge;
c++;
}
if (c == n)
break;
}
}
int main()
{
cin >> n;
cin >> m;
cin >> root;
struct nums edge1[1000000];
for (int i = 0; i < m; i++)
{
int v1, v2, edge;
scanf("%d%d%d", &v1, &v2, &edge);
edge1[count1].v1 = v1;
edge1[count1].v2 = v2;
edge1[count1].edge = edge;
count1++;
}
max_w(edge1);
cout << max1 << endl;
return 0;
}