Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok
Cod sursa(job #1930189)
Utilizator | Data | 18 martie 2017 16:21:50 | |
---|---|---|---|
Problema | Arbore partial de cost minim | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.64 kb |
#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 << a[i].x << " " << a[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;
}