Pagini recente » Cod sursa (job #865477) | Cod sursa (job #737939) | Cod sursa (job #516733) | Cod sursa (job #688218) | Cod sursa (job #2173373)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define nmax 200005
ifstream f("apm.in");
ofstream g("apm.out");
int p[nmax],n,m,totalcost;
struct str
{
int n1,n2,cost;
bool operator <(const str &other)const
{
return cost>other.cost;
}
};
priority_queue<str>krusk;
vector<pair<int,int>>edges;
int parinte(int x)
{
if (p[x]==x)
return x;
return p[x]=parinte(p[x]);
}
void unire(int x,int y)
{
p[parinte(x)]=parinte(y);
}
void read()
{
f>>n>>m;
for (int i=1;i<=n;++i)
p[i]=i;
for (int i=1; i<=m; ++i)
{
int e1,e2,e3;
f>>e1>>e2>>e3;
krusk.push({e1,e2,e3});
}
}
void solve()
{
while (!krusk.empty())
{
int n1=krusk.top().n1;
int n2=krusk.top().n2;
int co=krusk.top().cost;
krusk.pop();
if (parinte(n1)==parinte(n2))
continue;
totalcost+=co;
unire(n1,n2);
edges.push_back({n1,n2});
}
g<<totalcost<<'\n'<<edges.size()<<'\n';
for (auto w:edges)
g<<w.first<<' '<<w.second<<'\n';
}
int main()
{
read();
solve();
return 0;
}