91. 最短Hamilton路径--------memset()取值,二进制
作者:
cyuyu
,
2022-04-16 12:30:08
,
所有人可见
,
阅读 129
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=21,M=1<<21;
int f[M][N];
int w[N][N];//这里数据类型也不能随便用,比如这里使用ll数据类型会出现mle
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>w[i][j];
}
}
memset(f,60,sizeof f);
f[1][0]=0;
// cout<<f[0][0]<<endl;
for(int i=1;i<(1<<n);i++){
for(int j=0;j<n;j++){
if((i>>j)&1)
for(int k=0;k<n;k++)
if((i>>k)&1)
f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
//i-(1<<j)这里非常的精妙!!!!
}
}
cout<<f[(1<<n)-1][n-1]<<endl;
return 0;
}
/*
0x3f=1e10;
memset(a,127,sizeof(a));=0x7f=2e10
即得到无穷大。
memset(a,128,sizeof(a));=0x80
即得到无穷小,与上述的值互为相反数。
memset(a,60,sizeof(a));
即近似为第一个式子的数值的一半。
memset(a,0,sizeof(a));赋值0
memset(a,-1,sizeof(a));赋值-1
上述例子对于a数组为int或long long时,成立。
*/