P1111修复公路
一、题目描述
二、解题思路
并查集+快速排序
快速排序把时间少的放在前面,因为要最少时间修好,一共有n个村庄,所以只需要n-1条边即可通路,利用并查集判断是否可以达到同一个村庄,相当于需要增加1条路,当路的条数等于n-1时,便修好了。否则如果在m组公路中无法修好,那么输出-1即可。
三、代码实现
1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 int x; 5 int y; 6 int t; 7 }bucket[101100]; 8 int n,m; 9 int windows[101100]; 10 bool cmp(node a,node b) 11 { 12 return a.t < b.t; 13 } 14 int find(int u) 15 { 16 if(u == windows[u]) 17 return windows[u]; 18 return windows[u] = find(windows[u]); 19 } 20 void merge(int n,int m) 21 { 22 int t1,t2; 23 t1 = find(n); 24 t2 = find(m); 25 windows[t2] = t1; 26 } 27 int main() 28 { 29 cin >> n >> m; 30 int ans = -1; 31 for(int i = 1;i <= 5000;i++) 32 windows[i] = i; 33 for(int i = 0;i < m;i++) 34 cin >> bucket[i].x >> bucket[i].y >> bucket[i].t; 35 sort(bucket,bucket + m,cmp); 36 int cnt = n - 1; 37 for(int i = 0;i < m;i++){//n个村庄只需要n - 1条边就可以了 38 if(find(bucket[i].x) != find(bucket[i].y)){ 39 merge(bucket[i].x,bucket[i].y); 40 cnt--; 41 } 42 if(!cnt){ 43 ans = bucket[i].t; 44 break; 45 } 46 } 47 cout << ans; 48 return 0; 49 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}