// aarifshuvo ``CSEJU
#include <bits/stdc++.h>
#define ll long long
#define SZ(x) ((int)(x).size())
#define scl(x) scanf("%lld", &x)
#define scll(x,y) scanf("%lld %lld", &x, &y)
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<n;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define pri(a) cout<<a<<endl
#define prii(a,b) cout<<a<<" "<<b<<endl
using namespace std;
struct edge
{
int a,b,c;
edge(int _a, int _b, int _c)
{
a = _a;
b = _b;
c = _c;
}
bool operator < (const edge p) const
{
return c < p.c;
}
};
vector <edge> edges;
int par[26000];
int findr(int r)
{
if(par[r]==r) return r;
int x = findr(par[r]);
par[r] = x;
return x;
}
int main()
{
vector <int> res;
ll n,e,wt,x,y,z;
while(scll(n,e)==2 and n+e)
{
res.clear();
edges.clear();
REP(i,e)
{
scll(x,y);
scl(z);
edges.push_back(edge(x,y,z));
}
sort(ALL(edges));
REP(i,n+1) par[i]= i;
REP(i,SZ(edges))
{
int u = findr(edges[i].a),
v = findr(edges[i].b);
if(u!=v)
{
par[v] = u;
}
else res.push_back(edges[i].c);
}
if(SZ(res)==0) puts("forest");
else
{
bool fl = 0;
REP(i,SZ(res))
{
if(fl) putchar(' '); fl = 1;
printf(" %d", res[i]);
}
puts("");
}
}
return 0;
}
// ideas (unsorted)
what did the problem want?
undirected graph with edge weights,
n(1k) nodes ... edges(25k).... wt up to 2^31
n0 m0 terminate()
no loop
do mst and print the edges which are not used for avoiding cycle
and print them
No comments:
Post a Comment