洛谷P2820 局域网 (最小生成树)

题目链接:https://www.luogu.org/problemnew/show/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

所有边数权值之和减去最小生成树
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 using namespace std;
 7 int n,k,res;
 8 struct edge
 9 {
10     int u,v,cost;
11 }es[10005];
12 int par[10005];
13 void init()
14 {
15     for(int i=0;i<1000;i++) par[i]=i;
16 }
17 int Find(int x)
18 {
19     if(par[x]==x) return x;
20     else return Find(par[x]);
21 }
22 int cmp(edge x,edge y)
23 {
24     return x.cost<y.cost;
25 }
26 int kruscal()
27 {
28     init();
29     sort(es,es+k,cmp);
30     res=0;
31     for(int i=0;i<k;i++){
32         edge e=es[i];
33         if(Find(e.u)==Find(e.v)) continue;
34         par[Find(e.u)]=Find(e.v);
35         res+=e.cost;
36     }    
37     return res;
38 }
39 int main()
40 {
41     while(cin>>n>>k){
42         int sum=0;
43         for(int i=0;i<k;i++){
44             cin>>es[i].u>>es[i].v>>es[i].cost;
45             sum+=es[i].cost;
46         }
47         cout<<sum-kruscal()<<endl;
48     }
49     return 0;
50 }

 还是菜的一P,中了n的毒,不能放松警惕啊

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int maxn=1005;
 5 int n,k,cnt,res,sum;
 6 struct edge
 7 {
 8     int u,v,w;
 9 }es[maxn];
10 int cmp(edge x,edge y)
11 {
12     return x.w<y.w;
13 }
14 int par[maxn];
15 void init()
16 {
17     for(int i=0;i<maxn;i++) par[i]=i;
18 }
19 int Find(int x)
20 {
21     if(par[x]==x) return x;
22     else return Find(par[x]);
23 }
24 int kruscal()
25 {
26     init();
27     sort(es,es+k,cmp);
28     res=0;
29     cnt=n;
30     for(int i=0;i<k;i++){
31         int u=es[i].u,v=es[i].v,w=es[i].w;
32         if(Find(u)==Find(v)) continue;
33         par[Find(u)]=Find(v);
34         res+=w;
35         if(--cnt==1) break;
36     }
37     return res;
38 }
39 int main()
40 {
41     while(cin>>n>>k){
42         sum=0;
43         for(int i=0;i<k;i++){
44             cin>>es[i].u>>es[i].v>>es[i].w;
45             sum+=es[i].w;
46         }
47         cout<<sum-kruscal()<<endl;
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/wydxry/p/10574600.html