Pagini recente » Cod sursa (job #2296120) | Cod sursa (job #1754603) | Cod sursa (job #159010) | Cod sursa (job #668425) | Cod sursa (job #1537417)
#include <fstream>
#include <vector>
#include <algorithm>
#include <utility>
#include <limits>
using namespace std;
typedef pair<int,pair<int,int>> PIPII;
const int INF = numeric_limits<int>::max()>>1;
vector<int> parent,rnk;
int Find(int x)
{
int a=x;
while(a!=parent[a]) a=parent[a];
while(x!=a){
int b=parent[x];
parent[x]=a;
x=b;
}
}
void Union(int x, int y)
{
int rx=Find(x), ry=Find(y);
if(rx!=ry){
if(rnk[rx]<rnk[ry]) parent[rx]=ry;
else if(rnk[rx]>rnk[ry]) parent[ry]=rx;
else{ parent[rx]=ry; rnk[ry]++;}
}
}
int main()
{
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m; fin>>n>>m;
parent.resize(n+1); rnk.resize(n+1);
for(int i=1;i<=n;++i){parent[i]=i; rnk[i]=0;}
vector<PIPII> edg(m);
for(int i=0;i<m;++i){
fin>>edg[i].second.first;
fin>>edg[i].second.second;
fin>>edg[i].first;
}
sort(edg.begin(),edg.end());
int sum=0,cnt=0;
for(int i=0;i<m;++i){
int a=edg[i].second.first, b=edg[i].second.second;
int pa=Find(a), pb=Find(b);
if(pa==pb) edg[i].first=INF;
else{
sum+=edg[i].first;
++cnt;
Union(pa,pb);
}
}
fout<<sum<<'\n'<<cnt<<'\n';
for(int i=0;i<m;++i) if(edg[i].first!=INF)
fout<<edg[i].second.first<<' '<<edg[i].second.second<<'\n';
}