数据结构小学期第一天

今日要完成的任务是最小生成树(普里姆算法)

试实现普里姆最小生成树算法。

函数接口定义:
void Prim(AMGraph G, char u);
其中 G 是基于邻接矩阵存储表示的无向图,u表示起点

裁判测试程序样例:
#include <iostream>
#define MVNum 10
#define MaxInt 32767
using namespace std;

struct edge{
char adjvex;
int lowcost;
}closedge[MVNum];

typedef struct{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G , char v);//实现细节隐藏
int Min(AMGraph G);//实现细节隐藏
int CreateUDN(AMGraph &G);//实现细节隐藏

void Prim(AMGraph G, char u);

int main(){
AMGraph G;
CreateUDN(G);
char u;
cin >> u;
Prim(G , u);
return 0;
}

/* 请在这里填写答案 */
输入样例:
第1行输入结点数vexnum和边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。最后一行输入一个字符表示最小生成树的起始结点。

7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
0
输出样例:
按最小生成树的生成顺序输出每条边。

0->5
5->4
4->3
3->2
2->1
1->6

复制代码
 1 void Prim( AMGraph G, char v )
 2     { 
 3         int distance[G.vexnum];
 4         int parent[G.vexnum];
 5         //记录v的下标
 6         int index=0;
 7         int i,min=MaxInt,imin,count=0;
 8         // 1.初始化这棵树,即以v为起始点,同时初始化数组distance[]
 9         //     注:distance数组表示该树的任意一点到该点的最小距离
10 
11         //寻找v的下标
12         for (i = 0; i < G.vexnum; i++)
13         {
14             if (G.vexs[i]==v)
15             {
16                 index=i;
17             }
18             
19         }
20         for (i = 0; i < G.vexnum; i++)
21         {
22             if (i==index)
23             {
24                 distance[i]=0;
25                 parent[i]=index;
26             }else
27             {
28                 distance[i]=G.arcs[index][i];
29                 parent[i]=index;
30             }       
31         }
32         while (1)
33         {
34             if (count==G.vexnum-1)
35             {
36                 break;
37             }
38             
39             // 2.从小树现有的结点出发,寻找边权值最小的点:
40             for ( i = 0; i < G.vexnum; i++){
41                 if (min>distance[i]&&distance[i]!=0)
42                 {
43                     //记录最小值及其下标
44                     min=distance[i];
45                     imin=i;
46                     
47                 }
48                 
49             }
50             //更新已到达过得节点数
51             
52             count++;
53             // 3.找到后输出该边
54             if (count<G.vexnum-1)
55             {
56                 printf("%c->%c\n",G.vexs[parent[imin]],G.vexs[imin]);
57             }else
58             {
59                 printf("%c->%c",G.vexs[parent[imin]],G.vexs[imin]);
60             }
61             
62             
63             
64             
65             //初始化min以便下次寻找
66             min=MaxInt;
67             // 4.将该点的distance数组中的值赋值为0,标记已经遍历过
68             distance[imin]=0;
69             // 5.循环遍历结点,更新distance[]数组
70             for ( i = 0; i < G.vexnum; i++){
71                 if (distance[i]!=0&&G.arcs[i][imin]<MaxInt)
72                 {
73                     if (distance[i]>G.arcs[i][imin])
74                     {
75                         distance[i]=G.arcs[i][imin];
76                         parent[i]=imin;
77                     }                   
78                 }
79             }            
80         }
81     }
复制代码

 

posted @   新晋软工小白  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-07-01 第一周汇报总结进度
点击右上角即可分享
微信分享提示