1 条题解
-
0
自动搬运
来自洛谷,原作者为

qwaszx
不再为往事受困.搬运于
2025-08-24 21:21:04,当前版本为作者最后更新于2018-08-20 10:17:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题解真的是五花八门啊orz
求最小生成树干什么啊难道不是个并查集板子
按时间sort一遍,每次合并两个节点,显然如果原先不连通那么合并之后联通块数量--
然后如果n==1就输出当前时间return
最小生成树放到这里有些浪费了
好像还有人写二分???二分干什么顺序遍历啊
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct hh { int x,y,t; }a[200000]; int f[200000],n,m; int cmp(const hh &a,const hh &b){return a.t<b.t;} int find(int x){return f[x]==x?x:(f[x]=find(f[x]));} int getin() { int x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar(); return x; } int main() { n=getin(),m=getin(); if(n==1){cout<<0;return 0;}//其实并没有什么用的特判 for(int i=1;i<=m;i++)a[i].x=getin(),a[i].y=getin(),a[i].t=getin(); sort(a+1,a+m+1,cmp); for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++) { int fx=find(a[i].x),fy=find(a[i].y); if(fx!=fy)f[fx]=fy,n--; if(n==1){cout<<a[i].t;return 0;} } cout<<-1<<endl; return 0; }
- 1
信息
- ID
- 113
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者