Pagini recente » Cod sursa (job #120178) | Cod sursa (job #2328189) | Cod sursa (job #1890150) | Cod sursa (job #2757914) | Cod sursa (job #2423092)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <tuple>
using namespace std;
vector <pair<int,int> > muchii;
priority_queue <tuple<int,int,int> >coada;
int tata[200005];
int rang[200005];
int find_father(int x)
{
if(x==tata[x])
return x;
return find_father(tata[x]);
tata[x]=tata[tata[x]];
}
void unite(int x, int y)
{
if(rang[x]>rang[y])
tata[y]=x;
if(rang[x]<rang[y])
tata[x]=y;
if(rang[x]==rang[y])
{
tata[x]=y;
rang[y]++;
}
}
int kruskal(int N, int M)
{
int x,y,c,cost=0,tx,ty;
tuple <int,int,int> tuplu;
while(coada.empty()==0)
{
tuplu=coada.top();
coada.pop();
c=-get<0>(tuplu);
x=get<1>(tuplu);
y=get<2>(tuplu);
tx=find_father(x);
ty=find_father(y);
if(tx!=ty)
{
unite(tx,ty);
muchii.push_back(make_pair(x,y));
cost+=c;
//nr_muc++;
}
}
return cost;
}
int main()
{
ifstream in("apm.in");
ofstream out("apm.out");
int N,M,x,y,c,i,cost;
in>>N>>M;
for(i=1;i<=M;i++)
{
in>>x>>y>>c;
coada.push(make_tuple(-c,x,y));
}
for(i=1;i<=N;i++)
{
tata[i]=i;
rang[i]=1;
}
cost=kruskal(N,M);
out<<cost<<endl;
int lim=muchii.size();
out<<lim<<endl;
for(i=0;i<lim;i++)
out<<muchii[i].first<<" "<<muchii[i].second<<endl;
return 0;
}