还在写随机化?错完了!
SleeplessSouris · · 题解
来看看确定性做法,全对!!1
假设路径经过的
我们可以先固定奇数位的剩余
每次搜完奇数位的点之后对于每个
反观随机化,理论上应当随机
#include<bits/stdc++.h>
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define pii pair<ll,ll>
#define rep(i,a,b) for(ll i=(a);i<=(b);++i)
#define per(i,a,b) for(ll i=(a);i>=(b);--i)
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
const ll N=85,INF=1e15;
ll n,k,a[N][N],d[N][N][7],r[N],ans=INF,v[N];
ll calc(ll i,ll j,ll k){
if(!k)return INF;
return a[i][k]+a[k][j];
}
void dfs(ll x){
if(x>k/2){
ll res=0;
rep(i,1,k/2-1){
rep(p,0,5){
if(!v[d[r[i]][r[i+1]][p]]){
res+=calc(r[i],r[i+1],d[r[i]][r[i+1]][p]);
break;
}
}
}
rep(p,0,5){
if(!v[d[r[k/2]][r[1]][p]]){
res+=calc(r[k/2],r[1],d[r[k/2]][r[1]][p]);
break;
}
}
ans=min(ans,res);
return ;
}
rep(i,1,n){
r[x]=i;
v[i]++;
dfs(x+1);
r[x]=0;
v[i]--;
}
}
int main(){
n=read(),k=read();
rep(i,1,n){
rep(j,1,n)a[i][j]=read();
}
rep(i,1,n){
rep(j,1,n){
rep(k,1,n){
if(k==i||k==j)continue;
d[i][j][6]=k;
per(p,5,0){
if(calc(i,j,d[i][j][p+1])<calc(i,j,d[i][j][p]))swap(d[i][j][p+1],d[i][j][p]);
else break;
}
}
}
}
r[1]=1,v[1]=1;
dfs(2);
write(ans);
return 0;
}