标签:
题意:从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 }
标签:
原文地址:http://www.cnblogs.com/ACMERY/p/4547465.html