# 题目

某个局域网内有 n(n100)n(n \le 100) 台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用 f(i,j)f(i,j) 表示 i,ji,j 之间连接的畅通程度,f(i,j)f(i,j) 值越小表示 i,ji,j 之间连接越通畅,f(i,j)f(i,j)00 表示 i,ji,j 之间无网线连接。

需要解决回路问题,我们将除去一些连线,使得网络中没有回路,并且被除去网线的 f(i,j)\sum f(i,j) 最大,请求出这个最大值。

Input

第一行两个正整数 n,kn,k

接下来的 kk 行每行三个正整数 i,j,mi,j,m 表示 i,ji,j 两台计算机之间有网线联通,通畅程度为 mm

Output

一个正整数, f(i,j)\sum f(i,j) 的最大值。

Sample Input & Output

5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
8

# 并查集

#include<bits/stdc++.h>
using namespace std;
struct ll{
	int xx,yy,zz;// 结构体分别存储边的两端点,长度
}a[100001];
bool cmp(ll x,ll y)
{
	return x.zz<y.zz;//sort 排序设置边长为关键字
}
int n,m,s,n1,f[100001],l1,r1;
int find(int a)// 找父亲
{
	if(f[a]==a)return a;
	f[a]=find(f[a]);
	return f[a];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].xx>>a[i].yy>>a[i].zz;
		s=s+a[i].zz;// 总长
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=n;i++)
	f[i]=i;// 赋初值
	for(int i=1;i<=m;i++)
	{
		l1=find(a[i].xx);r1=find(a[i].yy);
		if(l1!=r1)// 如果没联通,则联通 a [i].xx 和 a [i].yy 的父亲节点
		{
			f[l1]=r1;
			s-=a[i].zz;n1++;
		}
		if(n1==n-1)break;//n-1 条就可以退出
	}
	cout<<s;
	return 0;
}
更新於 閱讀次數

請我喝[茶]~( ̄▽ ̄)~*

fygod 微信支付

微信支付

fygod 支付寶

支付寶

fygod PayPal

PayPal