语句等价为啥一个AC一个WA

P3366 【模板】最小生成树

NeNe_ @ 2023-06-08 10:52:07

代码中用注释标注的双重循环若换成memset(a,MAXN,sizeof(a));则会全WA(好奇怪!)

#include <bits/stdc++.h>
using namespace std;
const int N=5005,MAXN=0xfffffff;
int n,m,minn,ans=0;
int minc[N],a[N][N];
int main()
{
    ios::sync_with_stdio(0);
    for(int i=0;i<N;i++)   //这里这里
    {
        for(int j=0;j<N;j++)
        {
            a[i][j]=MAXN;
        }
    }
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        if(z<a[x][y]) a[y][x]=a[x][y]=z;
    }
    if(n-1>m)
    {
        cout<<"orz";
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        minc[i]=a[1][i];
    }
    minc[1]=0;
    for(int i=1;i<n;i++)
    {
        int k;
        minn=MAXN;
        for(int j=1;j<=n;j++)
        {
            if(minc[j]&&minc[j]<minn) minn=minc[j],k=j;
        }
        minc[k]=0;
        ans+=minn;
        for(int j=1;j<=n;j++)
        {
            minc[j]=min(minc[j],a[k][j]);
        }
    }
    if(ans>=MAXN) cout<<"orz";
    else cout<<ans;
    return 0;
}

by diqiuyi @ 2023-06-08 11:05:24

@NeNe_ memset 的填充和直接赋值不太一样


by JLGxy @ 2023-06-08 11:09:08

memset 是按字节赋值的,memset(a,MAXN,sizeof(a)); 就是把每个字节都置为 0xff,所以所有 a[i][j] 都是 -1


by f_hxr_ @ 2023-06-08 11:45:46

@NeNe_

注意,memset如果要把整个数组赋值,那么只对1,0,-1有效!!!

————某本深蓝皮书(好像出自那)


by reveal @ 2023-06-08 11:56:42

@fhxr 经典错误言论,你有点太极端了。


by wvwit @ 2023-06-08 11:57:24

@NeNe_ 不一样,它按字节赋值,比如赋值1,他的二进制本该是00000000 00000000 00000000 00000001,但实际上是00000001 00000001 00000001 00000001,它将每个字节都赋值为你给的值,所以会与你写的数字有很大的差异


by NeNe_ @ 2023-06-09 07:47:42

谢谢谢谢谢谢谢谢谢谢神犇们!


|