HDU - 5637

题目链接:HDU - 5637


因为每次都是异或操作,所以从S->T,等价于异或的:0->S^T。所以我们从0开始跑BFS即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=20,mod=1e9+7;
int n,a[N],m,d[1<<18],res;
void solve(){
	cin>>n>>m; memset(d,-1,sizeof d); d[0]=0; res=0;
	for(int i=1;i<=n;i++)	cin>>a[i];
	queue<int> q; q.push(0);
	while(q.size()){
		int u=q.front();	q.pop();
		for(int i=1;i<=n;i++)	if(d[u^a[i]]==-1)	d[u^a[i]]=d[u]+1,q.push(u^a[i]);
		for(int i=0;i<17;i++)	if(d[u^(1<<i)]==-1) d[u^(1<<i)]=d[u]+1,q.push(u^(1<<i));
	}
	for(int i=1,a,b;i<=m;i++) scanf("%d %d",&a,&b),res=(res+1LL*i*d[a^b]%mod)%mod;
	printf("%d\n",res);
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

你可能感兴趣的:(HDU,bfs,思维题)