POJ 1258 Agri-Net(最小生成树-Prim)

来源:互联网 发布:centos git ssh配置 编辑:程序博客网 时间:2024/06/05 04:06

Description
有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离
Input
第一行一个整数n表示农场个数(3<=n<=100),然后是n个农场的距离矩阵
Output
输出安装光纤的最小总距离
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
Solution
最小生成树,因为给出了一个二维矩阵代表他们的距离,直接套一个prim模板就行了
Code

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int maxn = 150, INF = 0x3f3f3f3f;int cost[maxn][maxn], minicost[maxn];int M;bool used[maxn];void init(){    for (int i = 1; i <= M; i++)        used[i] = false;}int prim(){    for (int i = 1; i <= M; i++)        minicost[i] = cost[1][i];    used[1] = true;    int ans = 0;    for (int i = 2; i <= M; i++)    {        int index = -1;        int minic = INF;        for (int j = 1; j <= M; j++)            if (!used[j] && minicost[j] < minic)                index = j, minic = minicost[j];        if (index == -1)            return 0;        used[index] = true;        ans += minic;        for (int k = 1; k <= M; k++)            if (!used[k])                minicost[k] = min(minicost[k], cost[index][k]);    }    return ans;}int main(){    // freopen("in.txt", "r", stdin);    while (~scanf("%d", &M) && M)    {        init();        for (int i = 1; i <= M; i++)            for (int j = 1; j <= M; j++)                scanf("%d", &cost[i][j]);        int ans = prim();        if (ans != 0)            printf("%d\n", ans);    }    return 0;}
原创粉丝点击