Pagini recente » Cod sursa (job #2380574) | Rezultatele filtrării | Borderou de evaluare (job #1695703) | Rezultatele filtrării | Cod sursa (job #1094615)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back
#define x first
#define y second
#define dmax 200000
typedef pair<int, pair<int, int> > muchie;
muchie rt[dmax];
int st, sum, n, m;
vector <int > c[dmax], v;
void read()
{
freopen("apm.in", "r", stdin);
scanf("%i%i",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%i%i%i", &rt[i].y.x, &rt[i].y.y, &rt[i].x);
}
for(int i=1;i<=n;i++)
c[i].pb(i);
}
void conex(int a, int b)
{
v.pb(b);v.pb(a);
if(c[a][0]==a && c[b][0]==b)
c[a][0]=b;
else
{
int ca=a;
if(c[a].size()<c[b].size())
{
a=b;
b=ca;
}
for(int i=0; i<c[a].size(); i++)
c[b].pb(c[a][i]);
c[a].clear();
c[a].pb(b);
}
}
bool connected(int a, int b)
{
if(c[a][0]==b || c[b][0]==a)
return true;
return false;
}
void apm()
{
st=1;
for(int i=1; i<n; i++)
{
while(connected(rt[st].y.x, rt[st].y.y))
st++;
conex(rt[st].y.x,rt[st].y.y);
sum=sum+rt[st].x;
st++;
}
}
void write()
{
freopen("apm.out", "w", stdout);
printf("%i%c%i%c", sum, '\n',n-1, '\n');
for(int i=0;i<2*n-2;i+=2)
printf("%i%c%i%c", v[i],' ', v[i+1],'\n');
}
int main()
{
read();
sort(rt+1, rt+n-1);
apm();
write();
return 0;
}