-
Notifications
You must be signed in to change notification settings - Fork 9
/
图_最小生成树_普利姆算法(prim)_.cpp
144 lines (117 loc) · 2.11 KB
/
图_最小生成树_普利姆算法(prim)_.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<stdio.h>
#define Max 50
#define VertexType int
typedef struct
{
VertexType vexs[Max ][Max ];
int vexnum,arcnum;
}MGraph;
int CreateGraph(MGraph &G)
{
/*int a,b,w;
printf("请输入无向图的点的个数:\n");
scanf("%d",&G.vexnum);
printf("请输入无向图的边的条数:\n");
scanf("%d",&G.arcnum);
for(int i=1;i<G.vexnum+1;i++)
{
for(int j=1;j<G.vexnum+1;j++)
{
if(i==j)
{
G.vexs[i][j]=0;
}
else
{
G.vexs[i][j]=Max;
}
}
}
printf("请输入相连的点的序号,及权重:\n");
for(int i=1;i<G.arcnum+1;i++)
{
scanf("%d%d%d",&a,&b,&w);
G.vexs[a][b]=w;
G.vexs[b][a]=w;
}
*///方案一,m每次输入太麻烦
int i,j,w;
bool isDirected=1;
G.vexnum=5;
G.arcnum=7;
for(i=1;i<G.vexnum+1;i++)
{
for(j=1;j<G.vexnum+1;j++)
{
if(i==j)
{
G.vexs[i][j]= 0;
}
else
{
G.vexs[i][j]= Max;
}
}
}
G.vexs[1][2]=5;
G.vexs[1][3]=3;
G.vexs[1][5]=8;
G.vexs[2][3]=2;
G.vexs[2][4]=1;
G.vexs[3][5]=4;
G.vexs[4][3]=1;
}
int PrintGraph(MGraph G)
{
printf("输出图的结果为:\n");
for(int i=1;i<G.vexnum+1;i++)
{
for(int j=1;j<G.vexnum+1;j++)
{
printf("%3d ",G.vexs[i][j]);
}
printf("\n");
}
}
int Find_Graph_Way(MGraph &G)//普里姆算法
{
int min_weight[G.vexnum+1];
int from_adjvex[G.vexnum+1];
int i,j,minvex,minarc;
for(int i=1;i<G.vexnum+1;i++)
{
min_weight[i]=G.vexs[1][i];
from_adjvex[i]=1;
}
for(int i=2;i<G.vexnum+1;i++)
{
minarc=Max;
for(int j=1;j<G.vexnum+1;j++)
{
if(minarc>min_weight[j]&&min_weight[j]!=0)
{
minarc=min_weight[j];
minvex=j;
}
}
min_weight[minvex]=0;
printf("选择的点为: . %d == %d\n",minvex,minarc);
for(int j=1;j<G.vexnum+1;j++)
{
if(G.vexs[minvex][j]<min_weight[j]&&min_weight[j]!=0)
{
min_weight[j]=G.vexs[minvex][j];
from_adjvex[j]=minvex;
}
}
}
}
int main()
{
MGraph G;
//若有五个点,对应的序号依次为1,2,3,4,5;
CreateGraph(G);
//PrintGraph(G);
Find_Graph_Way( G);
return 0;
}