每日一题(5)poj,1258, AgriNet

1.      题目很简单,直接的最小生成树。一次ac。296K     47MS       

2.      感觉自己需要练练别的方法。prim算是很熟悉了。

3.      还是不要忘了吧minw的赋值放到while循环里面。

4.      在这里总结一下关于prim方法的步骤:

4.1. 初始化。需要初始化的变量比较多。

包括:1. 初始点;2. 返回值。3. 记录添加到生成树里面的数目的变量。4. 一个标志每个点是否已经添加到生成树里面的布尔数组。5. 一个记录和每个点相连的线段的最小值的数组。6. 当前下一步可用的线段里面的最短值。7. 下一步的起始点。

4.2. 循环。共两层。就是while和for.while表示每次添加一个点到生成树里面。For表示查找可以添加的线段里面的最短的。其中,for里面有两个if,第一个更新每个点关联的最小值。因为其他的非起始点在前一步已经获得最小值,不需要更新。第二个if表示获得目前所有点最小值里面的最小值作为下一次的开始,并赋给最小值,记录点的id号。

4.3. 还是循环中,在while循环里,for循环之后,进行复制以便于下一次循环。主要就是返回值增加,计数器增加。初始点更新。

5.      还有一点,关于头文件:

 <string.h>是旧的C 头文件,对应的是基于char*的字符串处理函数;

  <cstring>是对应于旧C 头文件的std 版本;

 <string>是包装了std 的C++头文件,对应的是新的string

6.      关于memset函数:

Memset的库函数memset()是针对字节操作的,其中第二个参数值被赋给第一个参数指向的内存地址开始的每一个字节,因此,这种初始化其实存在局限性,也导致其主要用于清除数组内容等。比如:假设i=0,1,2,...
memset(a,0,sizeof(a));  // 此时a[i]=0x00000000
memset(a,-1,sizeof(a)); // 此时a[i]=0xffffffff
memset(a,0x0f,sizeof(a)); // 此时a[i]=0x0f0f0f0f=252645135
由于500=0x1f4,400=0x190,因此,如果使用
memset(a,0x190,sizeof(a)); // 此时a[i]=0x90909090
所以,初始化过程还是建议使用循环语句来做。

6.1. 布尔数组是可以用的,无论赋值的是true还是FALSE。

6.2. 把数组设置为0可以用这个方法,甚是便捷。

6.3. 之前赋值,10000都会出错,因为int不是一个字节

6.4. 还有一点,就是sizeof加数组,真的就是数组占有的全部字节。但是,加上指针就不是了。

#include<iostream>
#include<string.h>
#include<stdio.h>

using namespace std;
const int inf = 110000;//无穷
const int maxs = 101;
int n;//farm的数目
int dist[maxs][maxs];

int prim ()
{
    int result = 0;//总共所需
    int s = 1;//起始点
    int flag[maxs] ;//标志每个点是否已经添加到树里面
    int minDist[maxs];//记录每个点相关的最短线段
    int minw ; //记录最小值
    int flagPoint;//下一次起始点
    int m = 1;//计数器

    for(int i =1; i<maxs; i++)
    {
        flag[i] = true;
    }
    for(int i = 1; i<maxs; i++)
    {
        minDist[i] = inf;
    }
    flag[s] = false;

    while(true)
    {
        minw = inf;
        if(m==n)
            break;
        for(int i = 2; i<=n; i++)
        {
            if(flag[i]&&minDist[i]>dist[s][i])
            {
                minDist[i] = dist[s][i];
            }
            if(flag[i]&&minw>minDist[i])
            {
                minw = minDist[i];
                flagPoint = i;
            }
        }

        s = flagPoint;
        flag[s] = false;
        //cout<<"minw: "<<minw<<endl;
        result+=minw;
        m++;
    }
    return result;
}
int main()
{
   // freopen("input.txt", "r",stdin);//文件读入,
    while(cin>>n&&n!=0)
    {
        for(int i = 1; i<=n;i++)
        {
            for(int j= 1; j<=n;j++)
            {
                cin>>dist[i][j];
            }
        }

        cout<<prim()<<endl;

    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值