洛谷P1111 修复公路
做完题看了一下题解,发现大佬们用的都是什么最小生成树,蒟蒻瑟瑟发抖,其实这题用最简单的并查集就可以通过
对于时间进行排序,从最早完成的时间开始,每次合并两条边,然后查看他们是否属于同一集合,如果是,输出完成时间,直接结束程序
如果遍历结束还没用都处于同一联通块,那么就输出-1.
~~不开O2记得卡常~~
附代码
#include<bits/stdc++.h> using namespace std; const int Maxn=100010,MAxn=1010; struct st{ int u,v,time; }road[Maxn]; int n,m,cnt[MAxn],fa[MAxn],size[MAxn]; int max(int a,int b){ return a>b?a:b; } int min(int a,int b){ return a<b?a:b; } int comp(const st &a,const st &b){ return a.time<b.time; } int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } void merge(int x,int y){ int xx=find(x); int yy=find(y); if(xx==yy) return; if(size[xx]>size[yy]) swap(xx,yy); fa[xx]=yy; size[yy]+=size[xx]; } bool Unicom(){ for(int i=2;i<=n;++i) if(find(i)!=find(i-1)) return false; return true; } int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;++i){fa[i]=i; size[i]=1;} for(int i=1;i<=m;++i) scanf("%d %d %d",&road[i].u,&road[i].v,&road[i].time); sort(road+1,road+1+m,comp); for(int i=1;i<=m;++i){ merge(road[i].u,road[i].v); if(Unicom()){ printf("%d",road[i].time); return 0; } } printf("-1"); return 0; }