来源
题目背景
某个局域网内有 n n n 台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用 f ( i , j ) f(i,j) f(i,j) 表示 i , j i,j i,j 之间连接的畅通程度, f ( i , j ) f(i,j) f(i,j) 值越小表示 i , j i,j i,j 之间连接越通畅, f ( i , j ) f(i,j) f(i,j) 为 0 0 0 表示 i , j i,j i,j 之间无网线连接。
题目描述
现在需要解决回路问题,我们将除去一些连线,使得网络中没有回路,不改变原图节点的连通性,并且被除去网线的 ∑ f ( i , j ) \sum f(i,j) ∑f(i,j) 最大,请求出这个最大值。
输入格式
第一行两个正整数 n , k n,k n,k。
接下来的 k k k 行每行三个正整数 i , j , m i,j,m i,j,m 表示 i , j i,j i,j 两台计算机之间有网线联通,通畅程度为 m m m。
输出格式
一个正整数, ∑ f ( i , j ) \sum f(i,j) ∑f(i,j) 的最大值。
样例 #1
样例输入 #1
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
样例输出 #1
8
提示
对于全部数据,保证 1 ≤ n ≤ 100 1\le n \le 100 1≤n≤100, 1 ≤ f ( i , j ) ≤ 1000 1\le f(i,j)\le 1000 1≤f(i,j)≤1000。
题解
首先读入n,k,然后每行读入x,y,z。
然后进行算法。
不说废话了,直接上代码:
#include <iostream>
#include <algorithm>
using namespace std;
int n, k, fa[105];
struct edge {
int x, y, z;
} e[10005];
bool cmp(edge a, edge b) {
return a.z < b.z;
}
int find(int x) {
if (x == fa[x])
return x;
fa[x] = find(fa[x]);
return fa[x];
}
int main() {
cin >> n >> k;
int all = 0;
for (int i = 1; i <= k; i++) {
cin >> e[i].x >> e[i].y >> e[i].z;
all += e[i].z;
}
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
sort(e + 1, e + 1 + k, cmp);
int cnt = 0, ans = 0;
for (int i = 1; i <= k; i++) {
int fx = find(e[i].x);
int fy = find(e[i].y);
if (fx != fy) {
fa[fx] = fy;
cnt++;
ans += e[i].z;
if (cnt == n - 1) {
break;
}
}
}
cout << all - ans;
return 0;
}