Pagini recente » Cod sursa (job #535344) | Cod sursa (job #2681947) | Cod sursa (job #2074955) | Cod sursa (job #358843) | Cod sursa (job #689987)
Cod sursa(job #689987)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct noduri{int from,to,cost;};
vector<noduri>v,sol;
vector<int>c;
int n,m,s,Nrcomp,Msel;
bool cmp(noduri i, noduri j)
{
return (i.cost>j.cost);
}
void citire()
{
freopen("apm.in","r",stdin);
scanf("%d%d",&n,&m);
int i,x,y,z;
Nrcomp=n;
c.push_back(1);
for(i=1;i<=n;++i)
c.push_back(i);
// printf("%d\n",c[0]);
noduri aux;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&aux.from,&aux.to,&aux.cost);
v.push_back(aux);
}
}
void afisare()
{
freopen("apm.out","w",stdout);
int i;
printf("%d\n%d\n",s,sol.size());
for(i=0;i<sol.size();++i)
printf("%d %d\n",sol[i].from,sol[i].to);
}
int main()
{
citire();
make_heap(v.begin(),v.end(),cmp);
while(Msel<n-1)
{
noduri aux;
int minim,maxim,i;
aux=v.front();
pop_heap(v.begin(),v.end(),cmp); v.pop_back();
if(c[aux.from]!=c[aux.to])
{
s=s+aux.cost;
sol.push_back(aux);
if(c[aux.from]>c[aux.to])
{
minim=c[aux.to];
maxim=c[aux.from];
}
else
{
minim=c[aux.from];
maxim=c[aux.to];
}
for(i=1;i<=n;++i) if(c[i]==maxim) c[i]=minim;
--Nrcomp;
++Msel;
}
}
afisare();
return 0;
}