P1364 医院设置 (补锅,memset初始化较大值不可用0x7fffffff )

P1364 医院设置

题解

弗洛伊德水过

注意初始化一个大数 

      0x3f 可以,0x5f 好像也可以,但是0x7fffffff 我是真的炸了,初始化为-1

(后面补锅有详细解释)

 

 

代码

#include<iostream>
#include<cstdio>
#include<algorithm> 
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>

using namespace std;

long long n,minn=1e11,ans;
int dis[101][101];

struct apnode
{
    int num,peo,l,r;
}node[101];

int main()
{
    memset(dis,0x3f,sizeof(dis));  //初始化0x3f,太大它就炸了 
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&node[i].peo ,&node[i].l ,&node[i].r );
        node[i].num =i;
        if(node[i].l !=0)
        dis[i][node[i].l]=dis[node[i].l][i]=1;
        if(node[i].r !=0)
        dis[i][node[i].r]=dis[node[i].r][i]=1;
        dis[i][i]=0;
    }

    for(int k=1;k<=n;k++)
      for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
            if(dis[i][j]>=dis[i][k]+dis[k][j])
                 dis[i][j]=dis[i][k]+dis[k][j];
    
    for(int i=1;i<=n;i++)
    {
        ans=0;
        for(int j=1;j<=n;j++)
           if(j!=i&&dis[j][i]>0)
              ans+=(dis[j][i]*node[j].peo) ;
    
        minn=min(minn,ans);
    }
    
    
    printf("%d\n",minn);
    
    return 0;


}

 

 

 

 

解释一下为什么本题不可以初始化0x7fffffff

      memset 是把你初始化的那个值,截取最后一位(也就是两个字节),填充数组里的各位(实际是4位)

比如说:初始化0x3f ,截取 3f ,填充到数组里,每个数组小格子里就被初始化为 3f3f3f3f

 

 

 

        so,如果你初始化为 0x7fffffff 那么就只会截取 最后两个字节 ff ,所以你就变成了-1,而不是一个很大的值

 

 


 

Ps:感谢 ych 纠正,感谢 rqy 讲解,感谢讲过这个东西的神仙(看来听课的时候我可能走神了

 

posted @ 2019-06-10 16:34  晔子  阅读(327)  评论(2编辑  收藏  举报