poj1258

学习算法,感觉到理论和实践还是有很大不同的,就算理解了一个算法,但也只有真正能用它来解决一个问题的时候才能算掌握了。算法的道路,行之不易,且行且珍惜。把学到的算法和A过的题总结在这里,当做是一个学习的过程吧。好了,废话不多说,看题目。
题目在这里,可以参考。http://poj.org/problem?id=1258

题意分析:大意就是说一个农民当上了镇长,然后他想把所有农民通过网络联系起来,自然的,这就涉及到了布设线路的费用问题,所以分析至此,我们就明白了,这是一道求最小生成树的问题,题目输入一个n,代表农民,也就是点的个数,然后输入一个矩阵,保存每两个点之间的权值,在本题中就是购买光纤的钱数,要求输出最少花费,也即最小生成树的权值和。

解法:最小生成树可以用prim算法或者是kruskal算法,我在这里用了prim算法。

上代码:
#include <iostream>
    #include <string.h>
    using namespace std;
    #define inf 2000000
    int prim(int matrix[105][105],int n)
    {
        bool visit[105];
        int result=0;
        int p[n];
        for(int i=1;i<=n;i++)
        {
            p[i] = matrix[1][i];
            memset(visit,0,sizeof(visit));
        }       
        for(int i=1;i<=n;i++)
        {
            int min=inf;
            int index=0;
            for(int j=1;j<=n;j++)
            {
                if(p[j]<min&&visit[j]==0)
                {
                    min = p[j];
                    index = j;
                }
            }
            result+=p[index];
            visit[index] = 1;
            //p[index]=0;
            for(int j=1;j<=n;j++)
            {
                if(!visit[j])p[j] = matrix[index][j]<p[j]?matrix[index][j]:p[j];
            }
        }
    //  for(int i=1;i<=n;i++)
    //      cout<<"p[i]"<<p[i]<<endl; 
        return result;
    }
    int main()
    {
        int n;
        int matrix[105][105];
        while(cin>>n)
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    matrix[i][j] = inf;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    cin>>matrix[i][j];
            cout<<prim(matrix,n)<<endl;             
        }
        return 0;
    }`

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值