题目背景
某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅通程度,f(i,j)值越小表示i,j之间连接越通畅,f(i,j)为0表示i,j之间无网线连接。
题目描述
需要解决回路问题,我们将除去一些连线,使得网络中没有回路,并且被除去网线的Σf(i,j)最大,请求出这个最大值。
输入输出格式
输入格式:
第一行两个正整数n k
接下来的k行每行三个正整数i j m表示i,j两台计算机之间有网线联通,通畅程度为m。
输出格式:
一个正整数,Σf(i,j)的最大值
输入输出样例
说明
f(i,j)<=1000
AC代码(详解在代码中)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /* 2 3 并查集可以解决最小生成树的问题!!!!!! 4 5 注意一点:两个计算机之间应该好像只能连一根线,否则,以下代码应该不成立。 6 7 */ 8 #include<bits/stdc++.h> 9 using namespace std; 10 int n,k,h,t,f[101]; 11 /*定义一个结构体,用来储存东西*/ 12 struct bcj 13 { 14 int x,y,l; 15 }a[10001]; 16 /*cmp函数,将i.l和j.l比较,从小到大排序*/ 17 bool cmp(bcj i,bcj j) 18 { 19 return i.l<j.l; 20 } 21 /*自定义find函数,方便用来查找*/ 22 int find(int i) 23 { 24 if(f[i]!=i) 25 f[i]=find(f[i]); 26 return f[i]; 27 } 28 /*以上代码是为下面的作铺垫*/ 29 30 31 /*GAME START*/ 32 int main() 33 { 34 /*定义变量和输入不多说*/ 35 int i,j; 36 cin>>n>>k; 37 for(i=1;i<=n;i++) 38 f[i]=i; 39 for(i=1;i<=k;i++) 40 { 41 cin>>a[i].x>>a[i].y>>a[i].l; 42 h+=a[i].l; 43 } 44 /*sort排序*/ 45 sort(a+1,a+1+k,cmp); 46 /*查找合并点*/ 47 for(i=1;i<=k;i++) 48 { 49 int r1=find(a[i].x); 50 int r2=find(a[i].y); 51 if(r1!=r2) 52 { 53 f[r1]=r2; 54 h-=a[i].l; 55 } 56 } 57 /*输出结束不多说*/ 58 cout<<h; 59 return 0; 60 }