Pagini recente » Cod sursa (job #2425898) | Cod sursa (job #137075) | Cod sursa (job #1381863) | Cod sursa (job #2984071) | Cod sursa (job #1930205)
#include <fstream>
#include <algorithm>
#define nmax 200005
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
class DisjointSet
{
private:
void Link(int x,int y)
{
if(a[x].r < a[y].r)
a[x].p = y;
else
{
a[y].p = x;
if(a[y].r == a[x].r)
a[x].r ++;
}
}
public:
struct Elem
{
int p,r;
};
Elem a[nmax];
void MakeSet(int x)
{
a[x].p = x;
a[x].r = 0;
}
int FindSet(int x)
{
if(a[x].p != x)
a[x].p = FindSet(a[x].p);
return a[x].p;
}
void Union(int x,int y)
{
Link(FindSet(x),FindSet(y));
}
};
struct muchie
{
int x,y,c;
};
muchie a[nmax],tree[nmax];
int n,m,nr,s;
DisjointSet disjset;
void read()
{
fin >> n >> m;
for(int i = 1;i <= m;i++)
fin >> a[i].x >> a[i].y >> a[i].c;
}
void kruskal()
{
for(int i = 1;i <= n;i++)
disjset.MakeSet(i);
for(int i = 1;i <= m;i++)
{
if(disjset.FindSet(a[i].x) != disjset.FindSet(a[i].y))
{
disjset.Union(a[i].x,a[i].y);
tree[++nr] = a[i];
s += a[i].c;
}
}
}
void afisare()
{
fout << s << "\n";
fout << n - 1 << "\n";
for(int i = 1;i <= nr;i++)
fout << tree[i].x << " " << tree[i].y << "\n";
}
bool cmp(muchie x,muchie y)
{
if(x.c < y.c)
return true;
return false;
}
int main()
{
read();
sort(a + 1,a + m + 1,cmp);
kruskal();
afisare();
return 0;
}