码迷,mamicode.com
首页 > 其他好文 > 详细

市赛E题---并查集

时间:2015-06-02 20:02:03      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

题意:从1到n有很多道路,但是每条道路有上限, 一张图,判断1到n的道路上的能通过的最小权值的最大值,

思路:并查集(其实就是最大生成树,改掉最小生成树的排序,按照从大到小排序即可)

结构体按从大到小排好序,然后遍历,不同集合合并,如果遍历到这条边,恰好1,n在一个集合里了,就停止,输出该条边的权值。因为向下的边更小了。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 
 6 using namespace std;
 7 
 8 const int maxn=1024;
 9 int T, n, m, a, b, l;
10 int p[maxn];
11 
12 int Find(int u)
13 {
14     return u==p[u]? u: p[u]=Find(p[u]);
15 }
16 
17 struct Edge
18 {
19     int x, y, l;
20     Edge(int x_, int y_, int l_) :x(x_), y(y_), l(l_) {}
21     bool operator <(const Edge& rhs) const
22     {
23         return l<rhs.l;
24     }
25 };
26 
27 vector<Edge> v;
28 
29 void init()
30 {
31     scanf("%d%d", &n, &m);
32     for(int i =0; i<maxn ; ++i) p[i]=i;
33     v.clear();
34 
35     for(int i =0; i<m; ++i)
36     {
37         scanf("%d%d%d", &a, &b, &l);
38         v.push_back(Edge(a, b, l));
39     }
40     sort(v.begin(), v.end());///按权值从大到小排序
41 }
42 
43 int solve()
44 {
45     int res=0;
46     for(int i=v.size(); --i>=0;)
47     {
48         Edge& t=v[i];
49         int pu=Find(t.x);
50         int pv=Find(t.y);
51         if(pu!=pv)///如果pu和pv不在一个集合,合并
52         {
53             p[pu]=pv;
54         }
55         if(Find(1) == Find(n))///如果1,n在一个集合就停,向下走的话,权值更小了
56         {
57             res=t.l;
58             break;
59         }
60     }
61     return res;
62 }
63 
64 int main()
65 {
66     scanf("%d", &T);
67     while(T--)
68     {
69         init();
70         printf("%d\n", solve());
71     }
72     return 0;
73 }
View Code

 

市赛E题---并查集

标签:

原文地址:http://www.cnblogs.com/ACMERY/p/4547465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!