并查集题目----局域网(洛谷P2820)

题目背景

某个局域网内有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)的最大值

 

输入输出样例

输入样例#1: 
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
输出样例#1: 
8

说明

f(i,j)<=1000

AC代码(详解在代码中)

 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 }
View Code

 

转载于:https://www.cnblogs.com/Michael666/p/10776413.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值