POJ1258 Agri-Net(最小生成树)

传送门:题目地址
本题是用的prim算法来求解最小生成树。(prim算法和dijkstra算法很相似)
AC代码如下:(题目中有题目翻译以及详细的注释)
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值