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/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~