首页 > 其他分享 >AT_abc190_e [ABC190E] Magical Ornament 题解

AT_abc190_e [ABC190E] Magical Ornament 题解

时间:2024-03-05 19:11:35浏览次数:36  
标签:ch qu ABC190E abc190 题解 int now id dis

分析

考虑状压。

定义状态函数 $f_{i,j}$ 表示在得到 $C$ 出现过的状态为 $i$ 且排列末尾为 $j$ 时的最小代价。则有转移方程:$f_{i,j}=\min{f_{i',k}+dis_{k,j}}$,保证 $i'$ 表示集合属于 $i$。$dis_{i,j}$ 跑最短路就行了,通过枚举 $C_i$ 为起点可以做到 $O(kn\log n) $ 的复杂度求。再注意一下空间问题即可。

复杂度 $O(kn\log n+2kk2)$。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,int>
#define x first
#define y second

il int read(){
	int 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<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}

const int N=1e5+10,M=1<<17|1,K=18;
int n,m,k;
int ne[N<<1],e[N<<1],h[N],idx;
int c[N];
int f[M][K];
int vis[K][N],dis[K][N];

il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il void dij(int s,int id){
	priority_queue<PII,vector<PII>,greater<PII>> qu;
	qu.push({0,s}),dis[id][s]=0;
	while(!qu.empty()){
		PII now=qu.top();qu.pop();
		if(vis[id][now.y]) continue;
		vis[id][now.y]=1;
		for(re int i=h[now.y];i;i=ne[i]){
			int j=e[i];if(dis[id][j]>dis[id][now.y]+1){
				dis[id][j]=dis[id][now.y]+1,qu.push({dis[id][j],j});
			}
		}
	}
	return ;
}
il void solve(){
	memset(dis,0x3f,sizeof(dis)),
	memset(vis,0,sizeof(vis)),
	memset(f,0x3f,sizeof(f));
	n=read(),m=read();
	for(re int i=1,a,b;i<=m;++i)
		a=read(),b=read(),
		add(a,b),add(b,a);
	k=read();
	for(re int i=1;i<=k;++i)
		c[i]=read(),dij(c[i],i);
	for(re int i=1;i<=k;++i) f[0][i]=0;
	for(re int i=1;i<(1<<k);++i){
		for(re int a=1;a<=k;++a){
			if(!((i>>(a-1))&1)) continue;
			for(re int b=1;b<=k;++b){
				if(!((i>>(b-1))&1)) continue;
				int lst=i-(1<<(a-1));
				f[i][a]=min(f[i][a],f[lst][b]+dis[b][c[a]]);
			}
		}
	}
	int Min=1e18;
	for(re int i=1;i<=k;++i) Min=min(Min,f[(1<<k)-1][i]);
	if(Min>1e9) printf("-1\n");
	else printf("%lld\n",Min+1);
	return ;      
}

signed main(){
	solve();
	return 0;
}

标签:ch,qu,ABC190E,abc190,题解,int,now,id,dis
From: https://www.cnblogs.com/harmisyz/p/18054683

相关文章

  • CF1800F Dasha and Nightmares 题解
    分析考虑枚举。注意到第二个条件是必须要有$25$个字符在里面出现过,故考虑枚举唯一没出现过的字符$k$,然后再枚举$s_i$。令$cnt_{i,j}$表示$s_i$中字符$c$出现的奇偶性。如果有字符$c\nek\landcnt_{i,c}=0$,则在$s_j$中必有$cnt_{j,c}=1$;反之同理。枚举字符$c......
  • P5655 基础数论函数练习题 题解
    分析考虑莫队。令$S=\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1})$。则对于新加进来的$a_r$,有:$$\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1},a_r)\=\operatorname{lcm}(S,a_r)\=\frac{S\timesa_r}{\gcd(S,a_r)}$$很容易发现,$S$在不取模的情况下会......
  • CF163A Substring and Subsequence 题解
    分析考虑DP。定义状态函数$f_{i,j}$表示在$s[1\dotsi]$中选一个子串$a$,在$t[1\dotsj]$中选一个子序列$b$,且$s_i,t_j$必选时$a=b$的方案数。则有两种情况:$s_i\net_j$。此时$a$和$b$是不可能相同的了,所以$f_{i,j}=0$。$s_i=t_j$。在只选$s_i,t_j$时......
  • CF101B Buses 题解
    分析考虑DP。由于$n$很大,而$m$可以接受,考虑根据公交车定义状态函数。很容易想到一种状态函数:$f_i$表示做第$i$辆公交车到$t_i$的方案数。根据题意,就有转移方程:$f_i=\sumf_j[s_i\let_j\let_i-1]+k$,$k$在$s_i=0$时为$1$,其余为$0$。然后这题就会了。求和部分......
  • AT_abc263_f [ABC263F] Tournament 题解
    分析一眼DP。定义状态函数$f_{i,j}$表示在第$i$此比赛中,获胜者为$j$时的最大奖学金。把比赛过程看成一棵倒着的满二叉树,就能发现:第$i$场比赛只会是其左儿子为根的子树中叶子节点的某一个与其右儿子为根的子树中叶子节点的某一个进行比赛。然后就可以得到转移方程:$f_{i,......
  • P10149 [Ynoi1999] XM66F 题解
    分析考虑莫队。对于$a_i=k(l\lei\ler)$的下标集合$S_k$,当其加入一个新的下标$x$时,这个新下标对答案的贡献分两种情况。第一种,$x$最小。相邻从下标的间隔中产生的贡献是$\sum(|S_k|-i+1)\times(ans_{S_{k,i+1}}-ans_{S_{k,i}})$。画个图可以理解一下:第二中,$x$最......
  • AT_abc343_G [ABC343G] Compress Strings 题解
    分析水题,评分能有$2100$可能是因为很多人卡E了。我说真的,E好难啊。$n$只有$20$,考虑从状压的角度入手。定义状态函数$f_{s,i}$表示当某个字符串$T$包含了所有$s$的二进制中为$1$的下标$S_j$且$T$末尾包含的子串为$S_i$时$T$的最小长度。那很显然的就有转......
  • 题解:卡农(组合计数+DP)
    题面题目链接简化一下,有\(3\)个限制:不能是空集。每个元素出现的次数必须为偶数。不能出现两个相同的集。思路首先不用状压,但是需要\(DP\),因为\(n\)范围过大用状压内存放不下,不然本来状压很好用的。考虑数学方法\(+DP\)。限制\(1\)因为不能有空集,所以可选......
  • tomcat8.5+ windows中html页面及控制台中文乱码问题解决办法
    tomcat8.5+windows中html页面及控制台中文乱码问题解决办法————————————————版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/onemy/article/details/106215384 https://blog.csdn.......
  • 题解 P10220【[省选联考 2024] 迷宫守卫】
    \(\text{Link}\)葬送了我2024省选的一题。题意有一颗深度为\(n+1\)的完全二叉树,其叶子上依次标有一个长为\(2^n\)排列\(a\),非叶结点有选择代价\(b_i\)。Alice、Bob两人进行游戏。Alice可以选择一些选择代价和不超过\(m\)的非叶结点,此后Bob会从根开始深度优先搜索......