题意分析:
给定一个有回路的无向图
要求去掉某些边 使得图中没有回路且不影响连通性
求这些边权值的最大值
解决思路:
去掉的最大 转化为 保留的最小
即求原图最小生成森林
在这个图的每一个联通块内 求最小生成树
原图权值总和与最小生成森林权值和相减 就是答案
Kruscal算法没有跑完整的时候 求的就是最小生成森林算法步骤:
1.将所有边按照权值从小到大排序
2.依次枚举每条边 不连通就加入生成森林 通过并查集判断是否联通
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110, M = 210;
int n, m;//点数边数
struct Edge
{
int a, b, w;
//重载<运算符 sort使用
bool operator < (const Edge& t)const
{
return w < t.w;
}
}e[M];
int p[N];
int find(int x)
{
return p[x] == x ? x : find(p[x]);
}
int main()
{
cin >> n >> m;
//并查集初始化
for (int i = 1; i <= n; i++)p[i] = i;
for (int i = 0; i < m; i++)
{
int a, b, w;
cin >> a >> b >> w;
e[i] = { a,b,w };
}
sort(e, e + m);
int res = 0;//统计没有放入最小生成森林的权值和
for (int i = 0; i < m; i++)
{
int pa = find(e[i].a), pb = find(e[i].b), w = e[i].w;
if (pa != pb)p[pa] = pb;
else res += w;
}
cout << res << endl;
return 0;
}