- ="alt">="keyword">voidPr_Vec
- {="comment">//输出所有点集_vec_vec ="alt">="keyword">for(="datatypes">i=0;i<_vec_vec.size;i)
- { ="alt">="keyword">for(="datatypes">j=0;j<_vec_vec[i].size;j)
- { ="alt">cout<<_vec_vec[i][j]<<="">"";
- } ="alt">cout<<endl;
- } ="alt">}
- ="keyword">voidKruskal(K_Chart*K,P_Chart&E) ="alt">{="comment">/*构造最小生成树Kruskal算法
- ="comment">输入:加权连通图K ="alt">="comment">输出:E组成G最小生成树边集合*/
- ="keyword">for(="datatypes">i=0;i<E.pos;i) ="alt">{
- E.flag[i]=="keyword">false; ="alt">="keyword">for(="datatypes">j=i;j<E.pos;j)
- { ="alt">E.A[j][i]=E.A[i][j]=INT_MAX;
- } ="alt">}
- MSort(K,K,0,K_i-1); ="alt">="datatypes">k=0,counter=0;
- ="datatypes">P1; ="alt">="datatypes">P2;
- ="keyword">do ="alt">{
- P1=K[k].po.P1; ="alt">P2=K[k].po.P2;
- ="alt">="keyword">(E.flag[P1]="keyword">false&&E.flag[P2]
- { ="alt">E.flag[P1]=="keyword">true;
- E.flag[P2]=="keyword">true; ="alt">_vec.clear;
- _vec.push_back(P1); ="alt">_vec.push_back(P2);
- _vec_vec.push_back(_vec); ="alt">
- counter; ="alt">distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value;
- } ="alt">="keyword">
- { ="alt">="keyword">(E.flag[P1]="keyword">false||E.flag[P2]="keyword">false)
- { ="alt">="datatypes">i;
- ="alt">="keyword">(E.flag[P1]="keyword">false)
- { ="alt">E.flag[P1]=="keyword">true;
- ="comment">// ="alt">i=Find_i(P2);
- _vec_vec[i].push_back(P1); ="alt">}
- ="keyword">="comment">//(E.flag[P2]false) ="alt">{
- E.flag[P2]=
="keyword">true;
="alt">="comment">//
- i=Find_i(P1); ="alt">_vec_vec[i].push_back(P2);
- } ="alt">distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value;
- counter; ="alt">}
- ="keyword">="comment">//(E.flag[P1]true&&E.flag[P2]true) ="alt">{
- ="datatypes">P1_i=Find_i(P1); ="alt">="datatypes">P2_i=Find_i(P2);
- ="keyword">(P1_i!=P2_i) ="alt">{
- ="keyword">(_vec_vec[P1_i].size>_vec_vec[P2_i].size) ="alt">{
- ="keyword">for(="datatypes">i=0;i<_vec_vec[P2_i].size;i) ="alt">{
- _vec_vec[P1_i].push_back(_vec_vec[P2_i][i]); ="alt">}
- _vec_vec.erase(_vec_vec.begin+P2_i);="comment">//删除点集 ="alt">}
- ="keyword"> ="alt">{
- ="keyword">for(="datatypes">i=0;i<_vec_vec[P1_i].size;i) ="alt">{
- _vec_vec[P2_i].push_back(_vec_vec[P1_i][i]); ="alt">}
- _vec_vec.erase(_vec_vec.begin+P1_i);="comment">//删除点集 ="alt">}
- distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value; ="alt">counter;
- } ="alt">}
- } ="alt">k;
- }="keyword">while(counter<E.pos-1); ="alt">="keyword">;
- } ="alt">="comment">//为GEK申请空间且化、、、
- ="keyword">voidInit_P_Chart(="datatypes">pos) ="alt">{
- ="comment">//为GEK申请空间 ="alt">G.A=="keyword">="datatypes">*[pos];
- E.A=="keyword">="datatypes">*[pos]; ="alt">G.flag=="keyword">="datatypes">bool[pos];
- E.flag=="keyword">="datatypes">bool[pos]; ="alt">K=="keyword">K_Chart[pos*(pos-1)/2];
- ="alt">E.pos=G.pos=pos;
- ="alt">="keyword">for
- { ="alt">G.A[i]=="keyword">="datatypes">[pos];
- E.A[i]=="keyword">="datatypes">[pos]; ="alt">G.flag[i]=E.flag[i]=="keyword">false;
- } ="alt">="comment">////为G,E,K化、、、
- K_i=0; ="alt">
- ="keyword">for(i=0;i<pos;i) ="alt">="keyword">for(="datatypes">j=i;j<pos;j)
- { ="alt">E.A[j][i]=E.A[i][j]=INT_MAX;
- ="keyword">(ij) ="alt">{
- G.A[j][i]=G.A[i][j]=0; ="alt">="comment">//continue;
- }="comment">/**/ ="alt">="keyword">
- { ="alt">K[K_i].value=G.A[j][i]=G.A[i][j]=rand%20+1;
- K[K_i].po.P1=i; ="alt">K[K_i].po.P2=j;
- } ="alt">
- } ="alt">
- } ="alt">="comment">//释放图空间GEK
- ="keyword">voidDelete_Chart(="datatypes">pos) ="alt">{
- ="keyword">for(="datatypes">i=0;i<pos;i) ="alt">{
- ="keyword">deleteG.A[i]; ="alt">="keyword">deleteE.A[i];
- } ="alt">="keyword">deleteK;
- ="keyword">deleteG.A; ="alt">="keyword">deleteE.A;
- ="alt">}
- ="comment">//输出图P,图K ="alt">="keyword">voidPr_P_Chart(="keyword">constP_Chart&G,="keyword">constK_Chart*K)
- { ="alt">cout<<="">"\n\n";
- ="keyword">for(="datatypes">i=0;i<G.pos;i) ="alt">{
- cout<<="">""; ="alt">="keyword">for(="datatypes">j=0;j<G.pos;j)
- { ="alt">="keyword">(G.A[i][j]INT_MAX)
- cout<<="">"∞"<<="">""; ="alt">="keyword">
- cout<<G.A[i][j]<<="">""; ="alt">}
- cout<<endl; ="alt">}
- ="comment">/* ="alt">="comment">for(i=0;i<K_i;i)
- ="comment">{ ="alt">="comment">cout<<""<<K[i].po.P1<<"--"<<K[i].po.P2<<":"<<K[i].value<<endl;
- ="comment">} ="alt">="comment">*/
- } ="alt">
- { ="alt">="datatypes">time_tt;
- srand((unsigned)time(&t)); ="alt">
- ="datatypes">charc; ="alt">="keyword">do
- { ="alt">="comment">//清空化
- _vec_vec.clear; ="alt">distance_P=0;
- distance_K=0; ="alt">="datatypes">pos;
- ="keyword">do ="alt">{
- system(="">"cls"); ="alt">cout<<="">"\n\n\n请输入生成树点数(>0):";
- cin>>pos; ="alt">}="keyword">while(pos<=0);
- ="comment">//为GE申请空间且化、、、 ="alt">Init_P_Chart(pos);
- Pr_P_Chart(G,K); ="alt">Prim(G,E);="comment">//
- cout<<="">"\n以上生成树由Prim算法求得最小生成树为(如下):";="comment">// ="alt">Pr_P_Chart(E,K);="comment">//
- cout<<="">"以上最小生成树路径长度:"<<distance_P<<endl;="comment">// ="alt">Kruskal(K,E);
- cout<<="">"\n以上生成树由Kruskal算法求得最小生成树为(如下):";="comment">// ="alt">Pr_P_Chart(E,K);
- cout<<="">"以上最小生成树路径长度:"
<<distance_K<<endl;="comment">//
="alt">Delete_Chart(pos);
- cout<<="">"\n\n!!!按任意键继续Esc退出!!!"<<endl; ="alt">}="keyword">while((c=getch)!=27);
- ="keyword">; ="alt">}
="keyword">false)
(="datatypes">i=0;i<pos;i)
="keyword">void
1.实验题目
用 kruskal 算法和 prim算法构造任意个无向图最小生成树
2.实验目
1)掌握最小生成树概念及其基本性质;
2)掌握最优子结构性质证明思路方法;
3)掌握贪心法设计思想并能熟练运用
3.实验要求
1)证明最小生成树满足最优子结构性质;
2)实现 kruskal和 prim算法;
3)设计测试数据对上述两个算法进行效率比较
数据结构:
/*定义用于Prim算法求解最小生成树结构体:
flag 标志对应点是否加入最小生成树(点)集合
A[i][j]存放点i到点j权重
pos记录该最小生成树点数 */
typedef struct P_Chart
{
bool *flag ;
**A ;
pos ;
} P_Chart ;
//存放条边两个点
typedef struct Po
{ P1 ;
P2 ;
} Po ;
/*定义用于Kruskal算法求解最小生成树结构体:
value 记录边权重
po存放该边两个点*/
typedef struct K_Chart
{ value ;
Po po ;
} K_Chart ;
//存放点集合--向量
typedef vector<> Int_Vec ;
//存放点集集合--(向量)向量
typedef vector<Int_Vec> Int_Vec_Vec ;//
声明:
//为GE K申请空间且化、、、
void Init_P_Chart( pos)
//释放图空间G E K
void Delete_Chart( pos)
//输出图P ,图K
void Pr_P_Chart(const P_Chart& G ,const K_Chart *K )
/*构造最小生成树Prim算法
输入:加权连通图 G
输出:E 组成 G 最小生成树边集合 */
//化最小生成树顶点集合
void Prim( P_Chart& G ,P_Chart& E )
// 将K1[s..t]归并排序为K2[s..t]
void MSort( K_Chart *K1 ,K_Chart *K2 , s, t)
//查找点po 在哪个点集集合_vec_vec哪个点集
//查找成功返回该点集位置否则返回-1
Find_i( po )
void Kruskal( K_Chart *K ,P_Chart& E )
{/*构造最小生成树Kruskal算法
输入:加权连通图 K
输出:E 组成 G 最小生成树边集合 */
void Kruskal( K_Chart *K ,P_Chart& E )
{/*构造最小生成树Kruskal算法
输入:加权连通图 K
输出:E 组成 G 最小生成树边集合 */
// 将K1[s..t]归并排序为K2[s..t]
void MSort( K_Chart *K1 ,K_Chart *K2 , s, t)
//查找点po 在哪个点集集合_vec_vec哪个点集
//查找成功返回该点集位置否则返回-1
Find_i( po )
/*构造最小生成树Kruskal算法
输入:加权连通图 K
输出:E 组成 G 最小生成树边集合 */
void Kruskal( K_Chart *K ,P_Chart& E )
最新评论