一、题目描述
二、题目分析
如果n个村庄要想通村,而这个公路又是双向的,那么就只需要n-1条边就行了,因此我们只需要解决的问题就是时间最少的问题了,我们只需要按时间进行一个快排就行了,然后判断是否拿到了n-1条边,拿到了就更新ans推出循环就行了,如果修完了m条路都没有n-1条边,那么就不能通车,输出-1即可。
三、代码实现
AC1
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++){ 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 }
AC2 暴力查询即可,查询当前是否已经能够通车
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 bool check() 28 { 29 for(int i = 1;i <= n;i++) 30 for(int j = i + 1;j <= n;j++) 31 if(find(i) != find(j)) 32 return false; 33 return true; 34 } 35 int main() 36 { 37 cin >> n >> m; 38 int ans = -1; 39 for(int i = 1;i <= 5000;i++) 40 windows[i] = i; 41 for(int i = 0;i < m;i++) 42 cin >> bucket[i].x >> bucket[i].y >> bucket[i].t; 43 sort(bucket,bucket + m,cmp); 44 for(int i = 0;i < m;i++){ 45 merge(bucket[i].x,bucket[i].y); 46 if(check()){ 47 ans = bucket[i].t; 48 break; 49 } 50 } 51 cout << ans; 52 return 0; 53 }