PAT_1003. Emergency

//
//  main.cpp
//  PAT_1003. Emergency
//
//  Created by wjq on 17/3/29.
//  Copyright © 2017年 wjq. All rights reserved.
//

#include <iostream>
#include <queue>
#include <string.h>
using namespacestd;
#define inf 999999
int weight[505];
int G[505][505],mindist,maxweight,mindistNum;
bool vis[505];
int nodeNum,edgeNum,C1,C2;
void dfs(int dist,int wei,int st)
{
    if(st==C2)
    {
        if(dist<mindist)
        {
            mindistNum=1;
            mindist=dist;
            maxweight=wei;
        }
        elseif(dist==mindist)
        {
            mindistNum++;
            if(wei>maxweight)
                maxweight=wei;
        }
        return;
    }
    if(mindist<dist)       //如果现在要找的这条路已经比找出来的路长了,那么这条路不继续深搜
        return;
    for(int i=0;i<nodeNum;i++)     //把每一个相邻节点作为目标节点
    {
        if(vis[i]==false&&G[st][i]!=inf)    //如果没有搜过,且要搜的这个点可达
        {
            vis[i]=true;
            dfs(dist+G[st][i],wei+weight[i],i);
            vis[i]=false;
        }
    }
}
int main()
{
    for(int i=0;i<505;i++)
    {
        for(int j=0;j<505;j++)
            G[i][j]=555;
    }
    memset(vis,false,sizeof(vis));
    mindist =inf;
    maxweight=mindistNum=0;
    int a,b,c;
    cin>>nodeNum>>edgeNum>>C1>>C2;
    for(int i=0;i<nodeNum;i++)
        cin>>weight[i];
    for(int i=0;i<edgeNum;i++)
    {
        cin>>a>>b>>c;
        G[a][b]=G[b][a]=c;
    }
    dfs(0,weight[C1],C1);
    cout<<mindistNum<<" "<<maxweight<<endl;
}



深搜一下就可以过了,然而刚开始却卡了很久- -

一直以为memset()可以赋任意的值,一开始用memset(G,inf,sizeof(inf));并不能达到我想要的赋值效果

查阅资料后发现:

memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)

做实验:

#include <iostream>

#include <string.h>

using namespacestd;

int main(int argc,const char * argv[])

{

    int a[100];

    memset(a,3,sizeof(a));

    cout<<a[0]<<" "<<a[1]<<endl;

}


输出为:

50529027 50529027



可以看到,memset确实只能赋-1或者0的.


此外,memset只能对连续的内存空间赋值,这题中G[505][505]显然是连续的,但如果用的malloc函数来分配内存的时候需要注意:

两次用malloc函数在堆上分的内存可能会不连续,因此用memset就会出错.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值