1.题目编号:1008
2.简单题意:给出一个图,要求出最大的pseudoforest,它是指这个图的一个子图,这个子图的每个连通分量中最多只能有一个环,而且这个子图的所有权值之和最大,就是伪森林
3.解题思路形成过程:求最小生成树改成了求最大生成树
4.感悟:并查集问题。。
5.AC的代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct node{
int u,v,c;
}Eg[100010];
bool cmp(node a,node b){
return a.c>b.c;
}
int f[10010];
bool flag[10010];
int Find(int x){
if(x!=f[x])
f[x]=Find(f[x]);
return f[x];
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m),n|m){
int i,j,k;
int u,v;
for(i=0;i<m;i++)
scanf("%d %d %d",&Eg[i].u,&Eg[i].v,&Eg[i].c);
sort(Eg,Eg+m,cmp);
int sum=0;
for(i=0;i<n;i++) f[i]=i,flag[i]=false;
for(i=0;i<m;i++){
u=Eg[i].u;
v=Eg[i].v;
u=Find(u);
v=Find(v);
if(u!=v){
if(!flag[u]&&!flag[v]){
f[u]=v;
sum+=Eg[i].c;
}
else if(!flag[u]||!flag[v]){
f[u]=v;
sum+=Eg[i].c;
flag[u]=flag[v]=true;
}
}
else{
if(!flag[u]){
flag[u]=true;
sum+=Eg[i].c;
}
}
}
printf("%d\n",sum);
}
return 0;
}