Pagini recente » Cod sursa (job #2452280) | Cod sursa (job #2103963) | Cod sursa (job #1565168) | Cod sursa (job #2074088) | Cod sursa (job #557345)
Cod sursa(job #557345)
#include<cstdio>
#define INF 10000002
#define Nmx 200001
using namespace std;
int n,m,H[Nmx*4],viz[Nmx],nr,dist[Nmx];
struct nod
{
int inf,cost;
nod *urm;
};
nod *G[Nmx];
struct ssol
{
int x,y;
}sol[Nmx];
void add(int x,int y,int c)
{
nod *aux=new nod;
aux->inf = y;
aux->cost = c;
aux->urm = G[x];
G[x] = aux;
}
void citire()
{
int x,y,c;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
add(x,y,c);
add(y,x,c);
}
}
void down(int k)
{
while(k*2<=nr)
{
int p=k*2;
if(p+1<=nr)
if(dist[H[p+1]]<dist[H[p]])
p=p+1;
int aux = viz[H[k]];
viz[H[k]] = viz[H[p]];
viz[H[p]] = aux;
aux = H[k];
H[k]=H[p];
H[p]=aux;
k=p;
}
}
void up(int k)
{
while(k>1)
{
if(dist[H[k/2]]<=dist[H[k]])
return;
int aux = viz[H[k]];
viz[H[k]] = viz[H[k/2]];
viz[H[k/2]] = aux;
aux = H[k];
H[k]=H[k/2];
H[k/2]=aux;
k=k/2;
}
}
void solve()
{
int sol=0;
for(int i=1;i<=n;++i)
dist[i]=viz[i]=INF;
dist[1]=0;
viz[1] = 1;
H[1]=1;
nr = 1;
for(int i=1;i<=n;++i)
{
int pzz=0,mn=INF+1;
pzz = H[1];
viz[H[nr]] = 1;
viz[H[1]] = -1;
H[1] = H[nr];
nr--;
sol+=dist[pzz];
viz[pzz]=1;
for(nod *p=G[pzz];p;p=p->urm)
{
if(dist[p->inf]>p->cost)
{
dist[p->inf]=p->cost;
if(viz[p->inf]==INF)
{
H[++nr]=p->inf;
viz[p->inf]=nr;
}
up(viz[p->inf]);
}
}
}
printf("%d\n",sol);
}
int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
citire();
solve();
return 0;
}