Pagini recente » Cod sursa (job #671265) | Cod sursa (job #1564666) | Cod sursa (job #33003) | Cod sursa (job #2566215) | Cod sursa (job #465677)
Cod sursa(job #465677)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define DM 400001
int x[DM],y[DM],cost[DM],ind[DM],n,m,gr[DM],tcost;
vector<int> sol;
int gaseste(int i) {
if(gr[i]==i) return i;
gr[i]=gaseste(gr[i]);
return gr[i];
}
void reuniune(int i,int j) {
gr[gaseste(i)]=gaseste(j);
}
bool cmp(int i,int j) {//pentru sortarea indicilor in functie de cost
return(cost[i] < cost[j]);
}
int main()
{
int i;
freopen("mesaj4.in","r",stdin);
freopen("mesaj4.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=m; i++) {
scanf("%d %d %d",&x[i],&y[i],&cost[i]);
ind[i]=i;
}
for(i=1; i<=n; i++) gr[i]=i;
sort(ind+1,ind+m+1,cmp);//sortam indicii crescator in functie de costuri
for(i=1;i<=m; i++) //pentru fiecare muchie x,y in ordinea crescatoare a costului
if(gaseste(x[ind[i]])!=gaseste(y[ind[i]])) {
tcost+=cost[ind[i]];
reuniune(x[ind[i]],y[ind[i]]);//se adauga muchia arborelui
sol.push_back(ind[i]);
}
if(tcost!=-1) {
printf("%d\n",tcost*2);
for(i=0; i<n-1; i++) printf("%d %d\n",x[sol[i]],y[sol[i]]);
for(i=0; i<n-1; i++) printf("%d %d\n",y[sol[i]],x[sol[i]]);
}
else printf("-1\n");
return 0;
}