本篇为文章是写的prime算法,本人见书上算法只有伪代码于是想着写出一个能跑的prime算法
本人写了一个下午的prime算法,但是运行的结果是不正确的 (本人是个小菜鸡) 经过朋友的帮助,运行结果正确。
我觉得算法主要先理解思想? ?在去试图打出分部的伪代码 最后打出能跑的代码
不多说上代码
# include <stdio.h>
# define m 31715
# define maxs 100
typedef struct {
int v[maxs]; // 顶点表
int arc[maxs][maxs];//边表
int v1, a1, w; //顶点数 和边数 权数
} tu;
int getid(tu t, int i) {
for (int j = 0; j < t.v1; j++) {
if (i == t.v[j])
return j;
}
return -1;
}
tu creat (tu t) {
printf("请输入定点数和边数");
//输入顶点数 边数
scanf("%d", &(t.v1));
// printf("进行到这了");
scanf("%d", &(t.a1));
for (int i = 0; i < t.v1; i++) { //初始化 顶点表
printf("请输入顶点");
scanf("%d", &t.v[i]);
}
printf("请输入边的权值");
for (int i = 0; i < t.v1; i++) {
for (int j = 0; j < t.v1; j++) {
scanf("%d", &t.arc[i][j]);
t.arc[j][i] = t.arc[i][j];
}
}
for(int i=0;i<t.v1;i++)
{
for(int j=0;j<t.v1;j++)
{
printf("%d ",t.arc[i][j]);
}
printf("\n");
}
return t;
}
void prime(tu *t) {
int tree[t->v1]; //用于存放邻接节点
int adjest[t->v1];
int lowcost [t->v1]; //用于存放到各边的权值
//初始化
for (int i = 0; i < t->v1; i++) {
lowcost[i] = t->arc[0][i]; // 先按以0为起点 到各边的权值
adjest[i]=0;
tree[i] = 0; //表示 各边均以 0 为起点
}
//寻找 lowcost中最小值
//要遍历
int cnt=0;
for (int w = 1; w < t->v1; w++) {
int min, k;min = 32767;//设置初始最小值
for (int i = 1; i < t->a1; i++) { //进行遍历 找到 lowcost中最小值 来确定 下一个进树的节点
if (lowcost[i] < min && lowcost[i] > 0) { // =0 表示已经进树
min = lowcost[i] ; //赋值
k = i; //记录i的值 用于后续进树操作和更新lowcost操作
}
}
tree[++cnt] = k;
lowcost[k] = 0;
for (int i = 1; i < t->v1; i++) { //为什么从1开始 ? 因为 lowcost数组中第一个数已经在树中 lowcost【0】=0;一定不满足下边if语句
if ( (lowcost[i]<0 || lowcost[i] > t->arc[k][i] )&& t->arc[k][i] >= 0) {
lowcost[i] = t->arc[k][i]; // 当满足if语句时 说明lowcost需要更新 把二维数组中的k行i列数据进行赋值
//表示这条边的起点为 k
// printf("here");
adjest[i]=k;
}
}
}
printf("入树的顺序");
for (int i = 0; i < t->v1; i++) {
printf("%d ", tree[i]);
}
printf("\n");
printf("边的前驱");
for (int i = 0; i < t->v1; i++) {
printf("%d ", adjest[i]);
}
}
int main() {
tu t;
t = creat(t);
prime(&t);
/*
prime 算法
建立 lowcost 数组
用于存放最小生成树的邻接边
如果两条边都指向同一个顶点 则 把最小的存入 lowcost
设置最小值 min =312715
比min小 则会进行 赋值
用for循环 进行全部比较
最后保留的是 最小权的下标和权值
下标的 lowcost 为0 则表示进树
则 lowcost会更新
如果 新进入树的节点的二维数组 中 第i个值 比lotcost 中第i个值 小则赋值
tree[i]=k; k 是 进入树的节点的下标
输出tree
*/
return 0;
}
|