目录
题目概述:
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxk 100001
int par[maxk], height[maxk];
int n, m, p;
void init(int n)
{
for (int i = 0; i < n; ++i)
{
par[i] = i;
height[i] = 0;
}
}
int myfind(int x)
{
if (par[x] == x)
return x;
else
return par[x] = myfind(par[x]);
}
void unite(int x, int y)
{
x = myfind(x);
y = myfind(y);
if (x == y)
return;
if (height[x] < height[y])
par[x] = y;
else
par[y] = x;
if (height[x] == height[y])
++height[x];
}
bool same(int x, int y)
{
return myfind(x) == myfind(y);
}
bool check(int m)
{
for (int i = 0; i < m; ++i)
{
if (!same(0, i))
return false;
}
return true;
}
struct road
{
int beg;
int end;
int cost;
};
road roads[maxk];
bool cmp(road x,road y)
{
return x.cost < y.cost;
}
bool tag[maxk];
int main()
{
std::ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
init(n);
int a, b, t;
for(int i=0;i<m;++i)
{
cin >> a >> b >> t;
roads[i].beg = (--a);
roads[i].end = (--b);
roads[i].cost = t;
}
sort(roads, roads + m, cmp);
int curr = roads[0].cost;
int ans = 0;
for (int i = 0; i < m; ++i)
{
if (tag[i])
continue;
if (check(n))
{
break;
}
ans = roads[i].cost;
for (int n = 0; i + n < m; ++n)
{
if (roads[i + n].cost != curr)
{
curr = roads[i + n].cost;
break;
}
tag[i + n] = 1;
unite(roads[i+n].beg, roads[i+n].end);
}
}
if (!check(n))
ans = -1;
cout << ans << endl;
return 0;
}
分析思路:
1.本题是一道并查集的模板题。把每条路径上的两个点当作一次合并操作,修复完成的条件就是所有路径点都在一个集合之中。
2.不过题目问的是最小时间,所以需要先封装路径为结构体,然后按照时间升序排列,这样才能求得最小时间。STL中的sort函数支持自定义排序方式。