Pagini recente » Cod sursa (job #532239) | Cod sursa (job #305601) | Cod sursa (job #3164701) | Cod sursa (job #909681) | Cod sursa (job #2552194)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX=200010;
int n,m;
int p[NMAX];
int costTotal;
struct muchie{
int a,b,c;
};
struct comparator{
bool operator()(muchie a,muchie b){
return a.c>b.c;
}
};
priority_queue<muchie,vector<muchie>,comparator>q;
queue<muchie>qSol;
void citire()
{
fin>>n>>m;
muchie cont;
for (int i=1; i<=n; i++)
p[i]=i;
for (int i=1; i<=m; i++){
fin>>cont.a>>cont.b>>cont.c;
q.push(cont);
}
}
int findSet(int i)
{
if (p[i]==i)
return i;
return (p[i]=findSet(p[i]));
}
bool sameSet(int a,int b)
{
return (findSet(a)==findSet(b));
}
void unionSet(int a, int b)
{
if (p[a]<p[b]){
p[p[a]]=p[b];
}else{
p[p[b]]=p[a];
}
}
void kruskal()
{
muchie cont;
for (int i=1; i<=n-1; i++){
cont=q.top();
q.pop();
while (sameSet(cont.a,cont.b)){
cont=q.top();
q.pop();
}
qSol.push(cont);
costTotal+=cont.c;
unionSet(cont.a,cont.b);
}
}
void afisare()
{
fout<<costTotal<<'\n';
fout<<n-1<<'\n';
muchie cont;
while (!qSol.empty()){
cont=qSol.front();
qSol.pop();
fout<<cont.a<<' '<<cont.b<<'\n';
}
}
int main()
{
citire();
kruskal();
afisare();
return 0;
}