P2622 关灯问题II(状压&spfa)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2622 关灯问题II(状压&spfa)相关的知识,希望对你有一定的参考价值。

P2622 关灯问题II(状压&spfa)

每个状态可以压缩表示。

然后看成节点,开关就是状态转移的路径。

然后就是跑最短路spfa。

然后这题不能状压dp,因为状态转移的时候有后效性,每个状态可能有比他它的状态转移过来,因为是有开有关。

/*Code by 520 -- 10.16*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=105;
int n,m,a[N],b[N],f[1<<11];
bool vis[1<<11];
queue<int>q;

int main()
	ios::sync_with_stdio(0);
	cin>>n>>m; int x,lim=(1<<n)-1;
	For(i,1,m) For(j,1,n) 
		cin>>x;
		if(x==1) a[i]|=(1<<j-1);
		if(x==-1) b[i]|=(1<<j-1);
	
	memset(f,0x3f,sizeof(f));
	f[0]=0;q.push(0);
	while(!q.empty())
		int u=q.front();q.pop();vis[u]=0;
		For(i,1,m) 
			int sta=(u|a[i])&(~b[i]);
			if(f[sta]>f[u]+1) 
				f[sta]=f[u]+1;
				if(!vis[sta]) vis[sta]=1,q.push(sta);
			
		
	
	cout<<(f[lim]==0x3f3f3f3f?-1:f[lim]);
	return 0;

以上是关于P2622 关灯问题II(状压&spfa)的主要内容,如果未能解决你的问题,请参考以下文章

P2622 关灯问题II(状态压缩+BFS)

luogu p2622关灯问题II

[luoguP2622] 关灯问题II(状压最短路)

状态压缩入门 P2622 关灯问题II

P2622 关灯问题II

关灯问题II 状压DP