# Problem H pseudoforest（伪森林，“最大生成树”）

Problem Description
In graph theory, a pseudoforest is an undirected graph in which every connected component has at most one cycle. The maximal pseudoforests of G are the pseudoforest subgraphs of G that are not contained within any larger pseudoforest of G. A pesudoforest is larger than another if and only if the total value of the edges is greater than another one’s.<br><br>

Input
The input consists of multiple test cases. The first line of each test case contains two integers, n(0 < n <= 10000), m(0 <= m <= 100000), which are the number of the vertexes and the number of the edges. The next m lines, each line consists of three integers, u, v, c, which means there is an edge with value c (0 < c <= 10000) between u and v. You can assume that there are no loop and no multiple edges.<br>The last test case is followed by a line containing two zeros, which means the end of the input.<br>

Output
Output the sum of the value of the edges of the maximum pesudoforest.<br>

Sample Input
3 3 0 1 1 1 2 1 2 0 1 4 5 0 1 1 1 2 1 2 3 1 3 0 1 0 2 2 0 0

Sample Output
3 5

============================

AC代码：

#include<bits/stdc++.h>
using namespace std;
struct tree
{
int l,r,v;
}a[100010];
int fat[10001];
int flag[100010];
int father(int x)
{
if(x!=fat[x]) fat[x]=father(fat[x]);
return fat[x];
}
void unionn(int x,int y)
{
fat[x]=y;
}
bool cmp(tree x,tree y)
{
return x.v>y.v;
}
int main()
{
int n,m;
while(cin>>n>>m&&n+m)
{
memset(flag,0,sizeof(flag));
for(int i=0;i<=n;++i)fat[i]=i;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
}
sort(a+1,a+1+m,cmp);
int tot=0;
for(int i=1;i<=m;++i)
{

int fa=father(a[i].l),fb=father(a[i].r);

if(fa!=fb)
{
if(flag[fa]&&flag[fb])continue;//若两个联通块均有环，则不能将它们合并；
tot+=a[i].v;
//cout<<a[i].l<<" "<<a[i].r<<" "<<i<<"yi"<<endl;
//cout<<fa<<" "<<fb<<"yi"<<endl;
unionn(fa,fb);
if(flag[fa]||flag[fb])//有一者已经成环，另一端也被标记；
{
flag[fa]=1;
flag[fb]=1;
}
}
else//当前两点在同一棵树中；
{
if(!flag[fa])//若未成环，如下操作；
{
tot+=a[i].v;
flag[fa]=1;
}
}
}
printf("%d\n",tot);
}
return 0;
}

The end；