随机化+黑白染色+dp——cf1310D

/*
随机,给每个点黑白随机黑白染色,由于题目要求路径必须黑白相间
dp[k][i]表示长度为k的路径,终点是i的最小代价
除去点1之外,最小值对应的路径里最多有9个点,那么这条路径随机到颜色对应的概率是1/512
那么随机5000次,这个概率就接近1了 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define N 100

ll n,mp[N][N],c[N],K,ans,dp[15][N];

void solve(){
    memset(dp,0x3f,sizeof dp);
    dp[0][1]=0;
    for(int k=1;k<=K;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(c[i]!=c[j] && dp[k-1][j]!=0x3f3f3f3f3f3f3f3f)
                    dp[k][i]=min(dp[k][i],dp[k-1][j]+mp[j][i]);
    ans=min(ans,dp[K][1]);
}

int main(){
    cin>>n>>K;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>mp[i][j];
    ans=0x3f3f3f3f3f3f3f3f;
    int t=5000;srand(time(0));
    while(t--){
        for(int i=1;i<=n;i++)c[i]=rand()%2;
        solve();
    }
    cout<<ans<<'\n';
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12503820.html
今日推荐