week6作业D

题意:
在这里插入图片描述
sample input:
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
sample output:
4

note:在这里插入图片描述思路:
求解最小生成树中耗时最大的边的值。与C题的思路大致相同,将边的值进行排序,将最小边的值进行记录,之后通过对边的值从小到大的顺序进行判断,如果新加入的边会与其他边形成环,则摈弃,继续对其他边进行判断,最终形成最小生成树,在形成最小生成树的过程中,加入的边的值与之前加入的边的最大值进行比较,更新新的最大值,并在最后将其进行输出。
代码:

#include<iostream>
#include<algorithm>
using namespace std;
int par[100050];
struct node{
	int begin;
	int end;
	int value;
	bool operator<(const node &te) const{
	return value < te.value;
    }
}temp[100050];
void init(int n) {
	for (int i = 1; i <= n + 1; i++)
		par[i] = i;
}
int find(int x)
{
	if(par[x]==x)
	{
		return x;
	}
	return par[x]=find(par[x]);
}
bool unite(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y)
	{
		par[x]=y;
		return true;
		//sum[y]=sum[y]+sum[x];
	}
    return false;
}
int main() 
{
	int n,m,root;
	int begin,end,value;
	int cm=0;
	int num=0;
	int ans;
	cin>>n>>m>>root;
	for(int i=0;i<m;i++)
	{
		cin>>begin>>end>>value;
		temp[cm].begin=begin;
		temp[cm].end=end;
		temp[cm].value=value;
		cm++;
	}
	init(n);
	sort(temp,temp+cm);
	for(int i=0;i<cm;i++)
	{
		
		if(unite(temp[i].begin,temp[i].end))
		{
			
			ans=max(ans,temp[i].value);
			num++;
		}
		if(num==n)
		{
			break;
		}
	}
	cout<<ans;
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值