Pagini recente » Cod sursa (job #386152) | Cod sursa (job #489044) | Cod sursa (job #386162) | Cod sursa (job #901002) | Cod sursa (job #902182)
Cod sursa(job #902182)
#include<stdio.h>
#include<vector>
#define maxn 200005
#define MAXX 999999999
using namespace std;
int n,m,d[maxn],poz[maxn],x[maxn],nh,r,t[maxn],cost;
vector < pair <int,int> > v[maxn];
void cit()
{
int i,p1,p2,cc;
scanf("%d %d",&n,&m);
r=1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&p1,&p2,&cc);
v[p1].push_back(make_pair(p2,cc));
v[p2].push_back(make_pair(p1,cc));
}
}
void swap(int i,int j)
{
int aux;
aux=x[i];
x[i]=x[j];
x[j]=aux;
poz[x[i]]=i;
poz[x[j]]=j;
}
void heapup(int k)
{
int i;
if(k<=1)
return ;
i=k/2;
if(d[x[k]]<d[x[i]])
{
swap(i,k);
heapup(i);
}
}
void heap_dw(int k)
{
int i=2*k;
if(i<=nh)
{
if(i+1<=nh && d[x[i+1]]<d[x[i]])
i++;
if(d[x[i]]<d[x[k]])
{
swap(i,k);
heap_dw(i);
}
}
}
int scoate_heap()
{
swap(1,nh);
poz[x[nh]]=0;
nh--;
return x[nh+1];
}
void prim()
{
int p,nrq,i;
for(i=1;i<=n;i++)
{
d[i]=MAXX;
x[i]=i;
t[i]=1;
poz[i]=i;
}
d[r]=0;
nh=n;
while(nh>0)
{
p=scoate_heap();
heap_dw(1);
cost+=d[p];
nrq=v[p].size();
for(i=0;i<nrq;i++)
{
if(d[v[p][i].first] > v[p][i].second && poz[v[p][i].first])
{
d[v[p][i].first]=v[p][i].second;
t[v[p][i].first]=p;
heapup(poz[v[p][i].first]);
}
}
}
}
void afis()
{
int i;
printf("%d\n%d\n",cost,n-1);
for(i=2;i<=n;i++)
printf("%d %d\n",i,t[i]);
}
int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
cit();
prim();
afis();
fclose(stdin);
fclose(stdout);
return 0;
}