#include <cstdio>
#include <vector>
#include <algorithm>
#define M 1001
#define EDGE pair < int,int >
using namespace std;
vector < pair < int,EDGE > > GRAPH;
int parent[M], Heavy[M],hn;
int findset(int x, int *parent);
int Kruskal(int);
int main()
{
int i,x,y,z,n,m;
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)&&(m|n))
{
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
GRAPH.push_back(pair< int, EDGE >(z, EDGE(x, y)));
}
hn = Kruskal(m);
if(!hn)
printf("forest\n");
else
for(i=0;i<hn;i++)
if(i==hn-1)
printf("%d\n",Heavy[i]);
else
printf("%d ",Heavy[i]);
GRAPH.clear();
}
return 0;
}
int findset(int x, int *parent)
{
if(x != parent[x])
parent[x] = findset(parent[x], parent);
return parent[x];
}
int Kruskal(int e)
{
int i, pu, pv,hn=0;
sort(GRAPH.begin(), GRAPH.end()); // increasing weight
for(i=0;i<M;i++)
parent[i] = i;
for(i=0; i<e; i++)
{
pu = findset(GRAPH[i].second.first, parent);
pv = findset(GRAPH[i].second.second, parent);
if(pu != pv)
parent[pu] = parent[pv]; // link
else
Heavy[hn++] = GRAPH[i].first;
}
return hn;
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.