【CCF 201703-4】地鐵修建(Kruskal 貪心 並查集)
阿新 • • 發佈:2018-12-10
題目抽象
修建一條結點1到結點n的一條路,使得這條路上最大的邊權最小
思路
從Kruskal演算法得到啟示,將邊按權重排序,不斷地加入最短的邊,直到結點1到結點n連通即可
判斷是否連通的方法:使用並查集
C++程式碼
類似於Kruskal演算法,只是結束條件不一樣
#include <iostream> #include <algorithm> using namespace std; int n,m,cnt=0; int parent[100005]; struct Edge { int a,b,len; bool operator < (const Edge& t) { return len < t.len; } } e[200005]; inline int find_set(int x) { return x == parent[x] ? x : parent[x] = find_set(parent[x]); } int main() { cin>>n>>m; for(int i=0; i<m; ++i) cin>>e[i].a>>e[i].b>>e[i].len; sort(e,e+m); for(int i=1; i<=n; ++i) parent[i] = i; for(int i=0; i<m; ++i) { if(find_set(e[i].a) != find_set(e[i].b)) parent[parent[e[i].a]] = parent[e[i].b]; if(find_set(1) == find_set(n)) { cout<<e[i].len; return 0; } } return 0; }