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]
都是
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
谢谢谢谢谢谢谢谢谢谢神犇们!