最小生成樹

Prime算法

掌握思想最重要,代碼只是練習


MST_Prim(Graph G){
	int min_weight[G.vexnum];
	int adjvex[G.vexnum];
	
	for(int i=0;i<G.vexnum;i++){
		min_weight[i]=G.Edge[0][i];
		adjvex[i]=0;
	}
	
	int min_arc;  //最小權重的邊 
	int min_vex;   //最小權重邊的另外一端節點的數組下標 
	
	for(int i=1;i<G.vexnum;i++){
		min_arc=MAX;
		for(int j=1;j<G.vexnum;j++){  //找出最小權值的邊 
			if(min_weight[j]!=0 && min_weight[j]<min_arc){
				min_arc=min_weight[j];   
				min_vex=j;
			}
			min_weight[min_vex]=0;  //表示將另外一個點已經添加進來了 
			for(int j=0;j<G.vexnum;j++){   //修改2個數組的值 
				if(min_weight[j]!=0 && G.Edge[min_vex][j]<min_weight[j]){
					min_weight[j]=G.Edge[min_vex][j];
					adjvex[j]=min_vex;
				}
			}
		}
	}
}

Kruskal算法

堆排序,並查集
typedef struct Edge{
	int a,b; 邊的2個端點
	int weight;  邊的權值
}; 

void MST_Kruskal(Graph G,Edge *edges,int *parent){
	heap_sort(edges);  //堆排序
	Initial(parent);   //並查集的初始化
	for(int i=0;i<G.arcnum;i++){
		int a_root=find(parent,edges[i].a);  //找a端點的根節點
		int b_root=find(parent,edges[i].b);   //找b端點的根節點
		if(a_root!=b_root) Unite(parent,a_root,b_root);  //若是沒有在一個集合,進行合併
	}
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息