Agri-Net

来源:互联网 发布:手绘板绘图软件 编辑:程序博客网 时间:2024/05/16 07:54

题意:已知N个点,以及这N个点两两间的距离,求最小生成树


解题思路

  1. Prim算法

代码

/*ID: zc.rene1LANG: CPROG: agrinet */#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 200000int N;int weight[100][100];int FindMinNode(int *in_tree, int *distance){    int i, min_i, min_distance = MAX;    for (i=0; i<N; i++)    {if (!in_tree[i]){    if (distance[i] < min_distance)    {min_distance = distance[i];min_i = i;    }}    }    return min_i;}int Prim(void){    int i, j, tree_size, tree_cost;    int *distance = (int *)malloc(N*sizeof(int));    int *in_tree = (int *)malloc(N*sizeof(int));    for (i=0; i<N; i++)    {distance[i] = MAX;in_tree[i] = 0;    }    tree_size = 1;    tree_cost = 0;    in_tree[0] = 1;    for (i=0; i<N; i++)    {distance[i] = weight[0][i];    }    while (tree_size < N)    {i = FindMinNode(in_tree, distance);tree_size++;tree_cost += distance[i];in_tree[i] = 1;for (j=0; j<N; j++){    if (i != j)    {if (distance[j] > weight[i][j]){   distance[j] = weight[i][j];}    }}    }    return tree_cost;}int main(void){    FILE *fin, *fout;    int i, j;        fin = fopen("agrinet.in", "r");    fout = fopen("agrinet.out", "w");    fscanf(fin, "%d", &N);    for (i=0; i<N; i++)    {for (j=0; j<N; j++){    fscanf(fin, "%d", &weight[i][j]);}    }    i = Prim();    fprintf(fout, "%d\n", i);    return 0;}




























原创粉丝点击