图的最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef _ _MY_KRUSKAL_H_ _
#define _ _MY_KRUSKAL_H_ _
#include"adj_list_undir_network.h"
#include"equivalence.h"
#include"min_priority_lk_queue.h"
template
struct KruskalEdge
{
int vertex1,vertex2;
WeightType weight;
KruskalEdge(int v1=-1,int v2=-1,int w=0):vertex1(v1),vertex2(v2),weight(w){};
};
template
bool operator<=(const KruskalEdge
return first.weight<=second.weight;
}
template
void MiniSpanTreeKruskal(const AdjListUndirNetwork
{
int vexNum=net.GetVexNum();
Equivalence equival(vexNum);
MinPriorityLinkQueue< KruskalEdge
for (int v=0;v { for(int u=net.FirstAdjVex(v);u>=0;u=net.NextAdjVex(v,u)) { if(v { KruskalEdge prioQ.InQueue(kEdge); } } } for(int count=0;count { KruskalEdge prioQ.OutQueue(kEdge); int v1=kEdge.vertex1,v2=kEdge.vertex2; if(equival.Differ(v1,v2)) { cout<<"edge:("< < count++; equival.Union(v1,v2); } } } #endif #include "stdafx.h" #include"Kruskal.h" #include"utility.h" int _tmain(int argc, _TCHAR* argv[]) { try { int infity=DEFAULT_INFINITY; char vexs[]={'A','B','C','D'}; int m[4][4]={ {infity,2,3,4}, {2,infity,5,6}, {3,5,infity,7}, {4,6,7,infity} }; int n=4; AdjListUndirNetwork for(int u=0;u { for(int v=0;v {if(m[u][v]!=infity) net.InsertEdge(u,v,m[u][v]); } } cout<<"原网"< Display(net); cout< system("PAUSE"); cout<<"Kruskal算法产生最小生成树的边:"< MiniSpanTreeKruskal(net); cout< } catch(Error err) { err.Show(); } system("PAUSE"); return 0; }