Copy kode kodenya sebagai berikut:
/*
Templat diagram pohon minimum-algoritma Zhu Liu
Deskripsi templat: Label titik harus 0-(N-1)
Titik ke dirinya sendiri harus dihilangkan (bobot tepi dari tepi ke dirinya sendiri tidak terbatas)
*/
#definisikan M 109
#definisikan ketik int
tipe const inf=(1)<<30;
struct Node{
ke dalam kamu, v;
jenis biaya;
}E[M*M+5];
int pra[M],ID[M],vis[M];
ketik Masuk[M];
int n,m;
ketik Directed_MST(int root,int NV,int NE) {
ketik ulang = 0;
sementara(benar) {
//1. Temukan tepi entri terkecil
untuk(int i=0;i<NV;i++) Dalam[i] = inf;
untuk(int i=0;i<NE;i++){
int u = E[i].u;
int v = E[i].v;
if(E[i].biaya < Dalam[v] && u != v) {
pra[v] = kamu;
Dalam[v] = E[i].biaya;
}
}
untuk(int i=0;i<NV;i++) {
jika(i == akar) lanjutkan;
if(In[i] == inf)return -1;//Tidak ada tepi masuk kecuali titik berikut, maka akar tidak dapat mencapainya
}
//2. Temukan cincinnya
int simpul = 0;
memset(ID,-1,ukuran(ID));
memset(vis,-1,ukuran(vis));
Di[root] = 0;
for(int i=0;i<NV;i++) {//Tandai setiap dering
ret += Dalam[i];
int v = saya;
while(vis[v] != i && ID[v] == -1 && v != root) {
melihat[v] = saya;
v = sebelum[v];
}
jika(v != akar && ID[v] == -1) {
untuk(int u = pra[v] ; u != v ; u = pra[u]) {
ID[u] = simpul cnt;
}
ID[v] = cntnode++;
}
}
if(cntnode == 0)break;//Tidak ada perulangan
untuk(int i=0;i<NV;i++) if(ID[i] == -1) {
ID[i] = cntnode++;
}
//3. Kecilkan poin dan tandai ulang
untuk(int i=0;i<NE;i++) {
int v = E[i].v;
E[i].u = ID[E[i].u];
E[i].v = ID[E[i].v];
jika(E[i].u != E[i].v) {
E[i].biaya -= Masuk[v];
}
}
NV = simpul pusat;
akar = ID[akar];
}
kembali mundur;
}