⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 最小生成树(prim+binary_heap邻接表形式).txt

📁 normal template for acm/ICPC
💻 TXT
字号:
//无向图最小生成树,prim算法+二分堆,邻接表形式,复杂度O(mlogm)
//返回最小生成树的长度,传入图的大小n和邻接表list
//可更改边权的类型,pre[]返回树的构造,用父结点表示,根节点(第一个)pre值为-1
//必须保证图的连通的!
#define MAXN 200
#define inf 1000000000
typedef double elem_t;
struct edge_t{
	int from,to;
	elem_t len;
	edge_t* next;
};

#define _cp(a,b) ((a).d<(b).d)
struct heap_t{elem_t d;int v;};
struct heap{
	heap_t h[MAXN*MAXN];
	int n,p,c;
	void init(){n=0;}
	void ins(heap_t e){
		for (p=++n;p>1&&_cp(e,h[p>>1]);h[p]=h[p>>1],p>>=1);
		h[p]=e;
	}
	int del(heap_t& e){
		if (!n) return 0;
		for (e=h[p=1],c=2;c<n&&_cp(h[c+=(c<n-1&&_cp(h[c+1],h[c]))],h[n]);h[p]=h[c],p=c,c<<=1);
		h[p]=h[n--];return 1;
	}
};

elem_t prim(int n,edge_t* list[],int* pre){
	heap h;
	elem_t min[MAXN],ret=0;
	edge_t* t;heap_t e;
	int v[MAXN],i;
	for (i=0;i<n;i++)
		min[i]=inf,v[i]=0,pre[i]=-1;
	h.init();e.v=0,e.d=0,h.ins(e);
	while (h.del(e))
		if (!v[e.v])
			for (v[e.v]=1,ret+=e.d,t=list[e.v];t;t=t->next)
				if (!v[t->to]&&t->len<min[t->to])
					pre[t->to]=t->from,min[e.v=t->to]=e.d=t->len,h.ins(e);
	return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -