[Jobdu] 题目1545:奇怪的连通图

题目描述:

已知一个无向带权图,求最小整数k。使仅使用权值小于等于k的边,节点1可以与节点n连通。

输入:

输入包含多组测试用例,每组测试用例的开头为一个整数n(1 <= n <= 10000),m(1 <= m <= 100000),代表该带权图的顶点个数,和边的个数。
接下去m行,描述图上边的信息,包括三个整数,a(1 <= a <= n),b(1 <= b <= n),c(1 <= c <= 1000000),表示连接顶点a和顶点b的无向边,其权值为c。 

输出:

输出为一个整数k,若找不到一个整数满足条件,则输出-1。 

样例输入:
3 3
1 3 5
1 2 3
2 3 2
3 2
1 2 3
2 3 5
3 1
1 2 3 
样例输出:
3
5
-1

开始看到题目感觉好复杂,先想到的是二分查找,可是即使是二分查找,复杂度也太高了。其实这题就是考并查集,按边的长度排序,第一次发现n与1连通时的边就是所求的k。因为已经排过序了。

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <cstdio>
 5 using namespace std;
 6  
 7 struct edge_t {
 8     int a, b;
 9     int dist;
10 };
11  
12 int n, m;
13 vector<edge_t> edges;
14 vector<int> father;
15  
16 int findFather(int x) {
17     while (x != father[x]) {
18         x = father[x];
19     }
20     return x;
21 }
22  
23 bool cmp(const edge_t &a, const edge_t &b) {
24     return a.dist < b.dist;
25 }
26  
27 void init() {
28     for (int i = 0; i < father.size(); ++i) 
29         father[i] = i;
30     sort(edges.begin(), edges.end(), cmp);
31 }
32  
33 void solve() {
34     for (int i = 0; i < m; ++i) {
35         int fa = findFather(edges[i].a);
36         int fb = findFather(edges[i].b);
37         if (fa < fb) father[fb] = fa;
38         else father[fa] = fb;
39         if (findFather(n) == 1) {
40             cout << edges[i].dist << endl;
41             return;
42         }
43     }
44     cout << "-1" << endl;
45 }
46  
47 int main() {
48     while (scanf("%d %d", &n, &m) != EOF) {
49         father.resize(n + 1);
50         edges.resize(m);
51         for (int i = 0; i < m; ++i) {
52             scanf("%d %d %d", &edges[i].a, &edges[i].b, &edges[i].dist);
53         }
54         init();
55         solve();
56     }
57     return 0;
58 }
59 /**************************************************************
60     Problem: 1545
61     User: hupo250
62     Language: C++
63     Result: Accepted
64     Time:640 ms
65     Memory:2248 kb
66 ****************************************************************/
原文地址:https://www.cnblogs.com/easonliu/p/4429249.html