题目背景
某个局域网内有 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
思路:
将所有边权加起来 记作 sum
跑最小生成树,将最小生成树的边权加起来 记作 res
那么答案就是 ans = sum - res
AC代码如下:
#include <bits/stdc++.h>
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0)
using namespace std;
const int N = 109;
bool st[N];
int d[N][N];
int dist[N];
int n, m;
int prim()
{
memset(dist, 0x3f, sizeof dist);
int res = 0;
for (int i = 0; i < n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
{
if (!st[j] && (t == -1 || dist[t] > dist[j]))
{
t = j;
}
}
if (i && dist[t] == 0x3f3f3f3f)
return 0x3f3f3f3f;
if (i)
res += dist[t];
for (int j = 1; j <= n; j++)
dist[j] = min(dist[j], d[t][j]);
st[t] = true;
}
return res;
}
int main()
{
// 最小生成树
// ans = sum - 最小生成树
buff;
int sum = 0;
cin >> n >> m;
memset(d,0x3f,sizeof d);
for (int i = 1; i <= m; i++)
{
int a, b, c;
cin >> a >> b >> c;
d[a][b] = c;
d[b][a] = c;
sum += c;
}
int ans = prim();
cout << sum-ans << endl;
return 0;
}