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
============================
题意:给出一张图,求该图的最大生成树,且规定每棵树中可以并只能存在一个环。
思路:通过父节点建立一个bool数组标记该联通块是否已经有环。
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;