最小生成树prime

来源:互联网 发布:阿里云 cdn 编辑:程序博客网 时间:2024/06/06 07:45

prime算法

每次加入已(加入树集合)结点连着(未加入树)的最短边直至所有结点加入最小生成树

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ssize_t 100
#define max_int 123456789


typedef struct Node
{
int map[ssize_t][ssize_t];
int n_num;
int sum;
}Adjacency_list;




void prime( Adjacency_list *g)
{
int i;
int j;
int k;
int temp;
int *lowcost = (int *)malloc(sizeof(int) * g->n_num);
bool *visited = (bool *)malloc(sizeof(bool) * g->n_num);

memset(visited,false,sizeof(visited));
visited[1] = true;

for(i = 1;i <= g->n_num;i++)
{
lowcost[i] = g->map[1][i];
}

for(i = 2;i <=g->n_num;i++)
{
temp = max_int;

for(j = 2;j <=g->n_num;j++)
{
if(!visited[j] && lowcost[j] < temp)
{
k = j;
temp = lowcost[j];

}

visited[k] = true;
g->sum = g->sum + temp;

for(j = 1;j <= g->n_num;j++)
{
if(!visited[j] && lowcost[j] > g->map[k][j])
{
lowcost[j] = g->map[k][j];

}

}

}


int main()
{
        int i;
int j;
int n;
int m;
int p,q,value;



scanf("%d%d",&n,&m);

Adjacency_list t;
t.n_num = n;
t.sum = 0;

for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
t.map[i][j] = max_int;
}
}

for(i = 1;i <= m;i++)
{
scanf("%d%d%d",&p,&q,&value);
t.map[p][q] = value;
t.map[q][p] = value;
}

prime(&t);
printf("%d",t.sum);
return 0;
}

0 0
原创粉丝点击