3. 羊羊修路

全过程

输入

输出

样例输入 复制

样例输出 复制

提示

代码


经过特色示范羊村检查,检查组觉得羊村的道路需要重修,破败的道路,会影响到小羊们上学的安全。

村长组织施工队,开始丈量距离,规划施工方案,已经得到了若干建筑物间修建道路的可行方案,共有N个建筑物,和M条可选道路。这些路保证可以将N个建筑相连。

最终方案中,羊村打算修建全球最豪华的全大理石道路,道路可以双向通行,且一体成型,路中无缝隙。为了达到这个设计要求,就必须自建大理石工厂!

大理石工厂建造的难度在于,必须根据其需要生产最大长度的大理石来设计。工厂可以生产出不超过其设计极限的任意长度的大理石。例如,设计长度为100的工厂,可以生产100、90等长度的大理石,但是不能生产长度为101的大理石。

羊村的预算有限,希望你能帮忙规划出一个修路方案,使得工厂的设计规模尽可能小,且可以保证其能生产的大理石可以连通所有羊村的建筑。求出工厂的最小设计规模。

输入

第一行两个整数N和M,N表示羊村中的建筑数量,M表示可以修建的道路数量。

接下来M行,每行三个整数Ai,Bi和Ci,表示从建筑Ai,到建筑Bi,可以修建一条长度为Ci的道路。

注意,建筑编号从1到N,两个建筑之间可能有多条道路。

输出

输出大理石工厂的最小设计规模。

样例输入 复制
3 3
1 2 100
2 3 101
1 3 99
样例输出 复制
100
提示

【样例解释】

只要修建1到2,以及1到3的道路,就可以使得3个建筑相互连通,且最大值只有100,只需要建造设计规模为100的大理石工厂,就可以生产出长度为100和99的大理石。

【数据范围】

30%的数据N<=10,N-1<=M<=100。

100%的数据1<=N<=2000,N-1<=M<=10000,1<=Ai,Bi<=N,1<=Ci<=1000000000。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,i,x,y,z,t,f[2000010],fx,fy,ans;
struct no{int x,y,z;}a[4000010];
bool cmp(no q,no h){return q.z<h.z;}
int fin(int x){
    if(x==f[x])return x;
    else return f[x]=fin(f[x]);
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin>>n>>m;
    for(i=1;i<=m;i++){
        cin>>x>>y>>z;
        a[++t].x=x;a[t].y=y;a[t].z=z;
        a[++t].x=y;a[t].y=x;a[t].z=z;
    }
    sort(a+1,a+1+t,cmp);
    for(i=1;i<=n;i++)f[i]=i;
    for(i=1;i<=t;i++){
        x=a[i].x;y=a[i].y;z=a[i].z;
        fx=fin(x);fy=fin(y);
        if(fx!=fy)
            f[fx]=fy,ans=max(ans,z);
    }
    cout<<ans;
}

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
int n,m,i,x,y,z,t,f[2000010],fx,fy,ans;
struct no{int x,y,z;}a[4000010];
bool cmp(no q,no h){return q.z<h.z;}
int fin(int x){
	if(x==f[x])return x;
	else return f[x]=fin(f[x]);
}
signed main(){
	ios::sync_with_stdio(false); 
	cin.tie(NULL);cout.tie(NULL);
	cin>>n>>m;
	for(i=1;i<=m;i++){
		cin>>x>>y>>z;
		a[++t].x=x;a[t].y=y;a[t].z=z;
		a[++t].x=y;a[t].y=x;a[t].z=z;
	}
	sort(a+1,a+1+t,cmp);
	for(i=1;i<=n;i++)f[i]=i;
	for(i=1;i<=t;i++){
		x=a[i].x;y=a[i].y;z=a[i].z;
		fx=fin(x);fy=fin(y);
		if(fx!=fy)
			f[fx]=fy,ans=max(ans,z);
	}
	cout<<ans;
}

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值