POJ1258 Agri-Net【最小生成树】

题意:

有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离。

思路:

又是一个最小生成树,因为给出了一个二维矩阵代表他们的距离,直接算prim就行了。

代码:

#include <iostream>
using namespace std;

#define maxn 105
#define inf 0x3f3f3f3f

int map[maxn][maxn],n;

void Prim()
{
    int i,j,d[maxn],vis[maxn],mi,v;
    for(i=1;i<=n;i++)
    {
        d[i]=map[1][i];
        vis[i]=0;
    }
    for(i=1;i<=n;i++)
    {
        mi=inf;
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]<mi)
            {
                mi=d[j];
                v=j;
            }
        vis[v]=1;
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]>map[v][j])
                d[j]=map[v][j];
    }
    for(d[0]=0,i=1;i<=n;i++) d[0]+=d[i];
    cout<<d[0]<<endl;
}

int main()
{
    int i,j;
    while(cin>>n)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                cin>>map[i][j];
        Prim();
    }
    return 0;
}

 

posted @ 2017-10-10 20:15  codeg  阅读(120)  评论(0编辑  收藏  举报