Pagini recente » Cod sursa (job #2538552) | Cod sursa (job #1405150) | Cod sursa (job #3154053) | Cod sursa (job #502809) | Cod sursa (job #2188965)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
vector <long long> a[200001];
vector <long long> cost[200001];
long long n,m,d[100001],x,y,pred[200001],s,h[200001],nh,poz[200001];
long long INF=10000000000;
void swapp(int p, int q)
{
swap(h[p],h[q]);
poz[h[p]]=p;
poz[h[q]]=q;
}
void urca(int p)
{
while(p>1&&d[h[p]]<d[h[p/2]])
{
swapp(p,p/2);
p/=2;
}
}
void coboara(int p)
{
int fs=2*p,fd=2*p+1,bun=p;
if(fs<=nh&&d[h[fs]]<d[h[bun]])
{
bun=fs;
}
if(fd<=nh&&d[h[fd]]<d[h[bun]])bun=fd;
if(bun!=p)
{
swapp(p,bun);
coboara(bun);
}
}
void adauga( int p)
{
h[++nh]=p;
poz[p]=nh;
urca(nh);
}
void sterge(int p)
{
swapp(p,nh--);
urca(p);
coboara(p);
}
void primm()
{
int c,y;
for(int i=1;i<=n;i++)
{
d[i]=INF;
h[i]=i;
poz[i]=i;
}
d[1]=0;
nh=n;
while(nh>0)
{
x=h[1];s+=d[x];
sterge(1);
for(int i=0;i<a[x].size();i++)
{
y=a[x][i];c=cost[x][i];
if(c<d[y] && pred[x] != y)
{
pred[y]=x;d[y]=c;
urca(poz[y]);
}
}
}
}
int main()
{
int i,j,cst;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y>>cst;
a[x].push_back(y);
a[y].push_back(x);
cost[x].push_back(cst);
cost[y].push_back(cst);
}
primm();
fout<<s<<'\n'<<n-1<<'\n';
i=1;
while(pred[h[i]]!=0)
{
fout<<h[i]<<" "<<pred[h[i]]<<'\n';
h[i]=pred[h[i]];
}
return 0;
}