概述:给出一些点,要求将这些点构成一个环,求在构成环的情况下,权值最大的情况。
思路:并查集的问题,用kruskal算法解决,讨论构成一个环还是两个环,一个环保留,两个环舍弃,输出整个图的最大值。
感想:套用kruskal算法的模板,感觉这套题现在做过的全都是套用了模板,解决问题,唯一需要的就是变动一下输入以及细节处理,就可以。
#include<iostream>
#include<string.h>
#include<fstream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX = 10005;
int sign[MAX];
int father[MAX];
struct node
{
int start;
int end;
int val;
}map[10*MAX];
int cmp(node a, node b)
{
return a.val > b.val;
}
int find(int x)
{
if (x != father[x])
father[x] = find(father[x]);
return father[x];
}
int main()
{
//ifstream cin("in.txt");
int n, m;
while (cin >> n >> m&&n + m)
{
memset(map, 0, sizeof(map));
int sum = 0;
for (int i = 0;i <= n;i++)
{
sign[i] = 0;
father[i] = i;
}
for (int i = 1;i <= m;i++)
cin >> map[i].start >> map[i].end >> map[i].val;
sort(map + 1, map + m + 1, cmp);
for (int i = 1;i <=m;i++)
{
int x = find(map[i].start);
int y = find(map[i].end);
if (x == y)
{
if (sign[x] == 1)
continue;
sign[x] = 1;
}
else
{
if (sign[x] == 1 && sign[y] == 1)
continue;
else if (sign[x] == 0)
father[x] = y;
else
father[y] = x;
}
sum += map[i].val;
}
cout << sum << endl;
}
return 0;
}