专栏文章

题解:CF1310D Tourism

CF1310D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqdx7zq
此快照首次捕获于
2025/12/04 03:13
3 个月前
此快照最后确认于
2025/12/04 03:13
3 个月前
查看原文
随机化是个好东西。
看到没有奇环,可以想到二分图。
想到二分图,就可以想到染色法。
因此,uvu \to v 当且仅当两个点颜色不同。
但题目中一点关于颜色的信息都没有,怎么办?
还有随机化
随机给每一个点分配颜色即可。
然后就是 dp:
dpi,st=mincolicoljdpj,st1+disti,jdp_{i,st}=\min_{col_i \ne col_j} {dp_{j,st-1} + dist_{i,j}}
其中,dpi,stdp_{i,st} 为走了 stst 步后到了 ii 的最大距离,colicol_i 表示颜色,disti,jdist_{i,j} 表示距离。
初始化:dp1,0=0dp_{1,0}=0
答案:dp1,kdp_{1,k}
当然随机化一次很可能出错,所以要多来几次。自测 30003000 次没有问题(当然也说不准)。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=85;
int a[N][N],f[N][N]; 
int d[N];
int main(){
	srand(time(NULL));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int T=3000;
	int ans=2e9;
	while(T--){
		for(int i=1;i<=n;i++){
			d[i]=rand()%2;
		}
		memset(f,0x3f,sizeof f);
		f[1][0]=0;
		for(int k=1;k<=m;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(d[i]!=d[j]){
						f[i][k]=min(f[i][k],f[j][k-1]+a[i][j]);
					}
				}
			}
		}
		ans=min(ans,f[1][m]);
	}
	cout<<ans;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...