POJ1258 Agri-Net(最小生成树)

传送门:题目地址
本题是用的prim算法来求解最小生成树。(prim算法和dijkstra算法很相似)
AC代码如下:(题目中有题目翻译以及详细的注释)
技术分享

/*题意如下:
农场主john当选为镇长,他曾许诺要为所以的农场连上网络。
现在有n个农场(包括他自己的农场),要求任意两个农场之间都能互相连通
为了最小化开支,他决定从他的农场向其它农场架设网线,
请问最小开销是多少呢?*/
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int inf=201314;
int n,cost[111][111],mincost[111];//cost[i][j]表示i到j的权值
//mincost[i]表示当前结点到各个结点的最小权值
bool used[111];//标记点已被使用
void prim()
{
    memset(used,false,sizeof(used));
    //初始化最初的顶点到各个结点的距离都为无限大
    for(int i=0;i<n;i++)mincost[i]=inf;
    for(int i=0; i<n; i++)
        mincost[i]=cost[0][i];//赋值
    used[0]=true;
    int sum=0;
    for(int ii=0; ii<n-1; ii++)
    {
        int mins=inf,pos=0;
        for(int i=0; i<n; i++)
            if(!used[i]&&mins>mincost[i])
                mins=mincost[pos=i];//在没有被使用过的结点中找到与当前顶点权值最小的结点。
        used[pos]=true;
        sum+=mins;//将最小权值加上。
        for(int i=0; i<n; i++)
            if(!used[i])//更新当前顶点到其他结点的最小权值。
                mincost[i]=min(mincost[i],cost[pos][i]);
    }
    cout<<sum<<endl;//输出最小生成树的权值和。
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",&cost[i][j]);
        prim();//最小生成树算法
    }
    return 0;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。