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.
|
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.
The last test case is followed by a line containing two zeros, which means the end of the input. |
Output
Output the sum of the value of the edges of the maximum pesudoforest.
|
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
|
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int circle[10005];
int total[10006];
struct node{
int a;
int b;
int dis;
}p[4000000];
bool cmp(node n1,node n2)
{
return n1.dis>n2.dis;
}
int parent[10005];
int num[10006];
void init(int n)
{
for(int i=1;i<=n;i++)
{
parent[i]=i;
num[i]=1;
circle[i]=0;
total[i]=0;
}
}
int find(int a)
{
if(a==parent[a])
return a;
parent[a]=find(parent[a]);
return parent[a];
}
int main()
{
// freopen("in.txt","r",stdin);
int n,m,k;
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
init(n);
int a,b,c;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
p[i].a=a+1;
p[i].b=b+1;
p[i].dis=c;
}
sort(p+1,p+m+1,cmp);
int ans=0;
for( i=1;i<=m;i++)
{
int a=p[i].a;
int b=p[i].b;
int p1=find(a);
int p2=find(b);
if(p1!=p2)
{
if(circle[p1]==0&&circle[p2]==0)
{
parent[p1]=p2;
ans+=p[i].dis;
}
if(circle[p1]==1&&circle[p2]==0)
{
parent[p2]=p1;
ans+=p[i].dis;
}
if(circle[p1]==0&&circle[p2]==1)
{
parent[p1]=p2;
ans+=p[i].dis;
}
}
if(p1==p2&&circle[p1]==0)
{
total[p1]+=p[i].dis;
circle[p1]=1;
ans+=p[i].dis;
}
}
cout<<ans<<endl;
}
return 0;
}