Pagini recente » Cod sursa (job #2372734) | Cod sursa (job #2560895) | Cod sursa (job #184179) | Cod sursa (job #1746577) | Cod sursa (job #260288)
Cod sursa(job #260288)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
typedef vector < pair<int,int> > vii;
#define INF 0x7f7f7f7f
#define to first
#define we second
#define MINP 1
#define le(K) (1<<K)
#define ri(K) ( (1<<K) + 1 )
#define fa(K) ( K >> 1 )
const int NMAX = 200000;
int N,M,next[NMAX],capm,H[NMAX],HSZ,pos[NMAX],cmin[NMAX];
bool intree[NMAX];
vii G[NMAX];
void readGraph() {
freopen("apm.in","r",stdin);
scanf("%d%d",&N,&M);
int x,y,w,i=0;
for(;i<M;++i) {
scanf("%d%d%d",&x,&y,&w);
G[--x].push_back(make_pair(--y,w));
G[y].push_back(make_pair(x,w));
}
}
void hswap(int x,int y) {
pos[H[x]] = y; pos[H[y]] = x;
int aux = H[x]; H[x] = H[y]; H[y] = aux;
}
void lift(int K) {
for(; K > 1 && cmin[H[K]] < cmin[H[fa(K)]] ; K = fa(K) )
hswap(K,fa(K));
}
void dip(int K) {
int p;
for(; ; K = p) {
p = K;
if(le(K) <= HSZ && cmin[H[le(K)]] < cmin[H[p]])
p = le(K);
if(ri(K) <= HSZ && cmin[H[ri(K)]] < cmin[H[p]])
p = ri(K);
if(p != K) hswap(p,K);
else break;
}
}
inline int hget(int K) {
return H[K];
}
int herase(int K) {
int sav = H[K];
hswap(K,HSZ--);
dip(K);
return sav;
}
void hinsert(int v,int c) {
H[++HSZ] = v; pos[v] = HSZ; cmin[v] = c;
lift(HSZ);
}
void hupdate(int K,int c) {
cmin[H[K]] = c;
if(K > 1 && cmin[H[K]] < cmin[H[fa(K)]])
lift(K);
else dip(K);
}
void prim() {
int vmin = -1;
memset(cmin,0x7f,sizeof cmin);
cmin[0] = 0;
hinsert(0,0);
for(int e=0;e<N;++e) {
if(vmin != -1) next[vmin] = hget(MINP);
vmin = herase(MINP);
intree[vmin] = true; //for(int i=0;i <N;++i) printf("%d cu costul %d\n",i,cmin[i]); printf("\n");
capm += cmin[vmin];
for(vii :: iterator it = G[vmin].begin(); it != G[vmin].end(); ++it)
if(!intree[it->to] && it->we < cmin[it->to])
if(cmin[it->to] == INF) hinsert(it->to,it->we);
else hupdate(pos[it->to],it->we);
}
next[vmin] = -1;
}
void writeTree() {
freopen("apm.out","w",stdout);
printf("%d\n%d\n",capm,N-1);
for(int t = 0; next[t] != -1; t = next[t])
printf("%d %d\n",t+1,next[t]+1);
}
int main() {
readGraph();
prim();
writeTree();
}