最小生成树prime
prime算法
每次加入已(加入树集合)结点连着(未加入树)的最短边直至所有结点加入最小生成树
源代码:
#include
#include
#include
#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;
}
还没有评论,来说两句吧...