Thursday, May 26, 2011

11747 - Heavy Cycle Edges


#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.