Pagini recente » Borderou de evaluare (job #2002016) | Cod sursa (job #414408) | Cod sursa (job #729750) | Cod sursa (job #927457) | Cod sursa (job #2399055)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int Nmax=400000;
struct muchie
{
int x,y,c;
};
muchie v[Nmax+5];
muchie sol[(Nmax>>1)+5];
void Interclasare(int p,int u,int m)
{
int i,j,k=0;
muchie a[u-p+1]={0};
i=p;
j=m+1;
while(i<=m && j<=u)
{
if(v[i].c>v[j].c)
a[++k]=v[j],j++;
else
a[++k]=v[i],i++;
}
if(i<=m)
while(i<=m)
a[++k]=v[i],i++;
if(j<=u)
while(j<=u)
a[++k]=v[j],j++;
for(int i=1; i<=k; i++)
v[p+i-1]=a[i];
}
void Divide(int p,int u)
{
int m;
if(u<=p+1)
{
///daca avem cel putin 2 elemente in bucatica creata
if(v[p].c>v[u].c)
swap(v[p],v[u]);
}
else
{
m=(p+u)/2;
Divide(p,m);
Divide(m+1,u);
Interclasare(p,u,m);
}
}
int main()
{
int arb[(Nmax>>1)+5]= {0},n,m;
fin>>n>>m;
int nr=0;
while(m--)
{
nr++;
fin>>v[nr].x>>v[nr].y>>v[nr].c;
}
Divide(1,nr);
//for(int i=1; i<=nr; i++)
// cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].c<<"\n";
for(int i=1; i<=n; i++)
arb[i]=i;
int nrsel=0;
int k=1,cost=0;
do
{
// if(nrsel==n-1)break;
if(arb[v[k].x]!=arb[v[k].y])
{
int c,b;
nrsel++;
cost+=v[k].c;
sol[nrsel].x=v[k].x;
sol[nrsel].y=v[k].y;
c=max(arb[v[k].x],arb[v[k].y]);
b=min(arb[v[k].x],arb[v[k].y]);
for(int j=1; j<=n; j++)
if(arb[j]==b)
arb[j]=c;
}
k++;
}
while(nrsel!=n-1);
fout<<cost<<"\n"<<nrsel<<"\n";
for(int i=1; i<=nrsel; i++)
fout<<sol[i].x<<" "<<sol[i].y<<"\n";
}