Pagini recente » Cod sursa (job #669828) | Cod sursa (job #31274) | Cod sursa (job #1349843) | Cod sursa (job #298029) | Cod sursa (job #709953)
Cod sursa(job #709953)
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define nmax 200001
using namespace std;
vector<pair<int,pair<int,int> > > G;
int n,m,x,y,cost,sum,dad[nmax],nr;
vector<int> child[nmax];
vector<pair<int,int> > sol;
void citire()
{
int i;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
{
dad[i]=i;
child[i].push_back(i);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d", &x, &y, &cost);
G.push_back(make_pair(cost,make_pair(x,y)));
}
}
int main()
{
int min,max;
vector<pair<int, pair<int,int> > >::iterator it;
vector<int>::iterator IT;
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
citire();
sort(G.begin(),G.end());
for(it=G.begin();it!=G.end()&&nr!=n-1;it++)
{
pair<int, pair<int,int> > nod=*it;
if(dad[nod.second.first]!=dad[nod.second.second])
{
nr++;
sum+=nod.first;
sol.push_back(make_pair(nod.second.first,nod.second.second));
if(dad[nod.second.first]<dad[nod.second.second])
{
min=dad[nod.second.first];
max=dad[nod.second.second];
}
else
{
min=dad[nod.second.second];
max=dad[nod.second.first];
}
for(IT=child[max].begin();IT!=child[max].end();IT++)
{
dad[*IT]=min;
child[min].push_back(*IT);
}
}
}
printf("%d\n%d\n", sum, n-1);
for(int i=0;i<n-1;i++)
printf("%d %d\n",sol[i].first,sol[i].second);
return 0;
}