AtCoder 199 D - RGB Coloring 2(枚举,暴力)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder 199 D - RGB Coloring 2(枚举,暴力)相关的知识,希望对你有一定的参考价值。

LINK

觉得自己又脑瘫了

暴力枚举每个点的颜色复杂度是 O ( 3 n ) O(3^n) O(3n),显然无法接受

考虑直接去 d f s dfs dfs,只有第一个点的颜色有三种选择

之后的每个点因为前一个点的约束只有两种选择,就算每个点都暴力枚举也只有 2 n 2^n 2n

于是我们就直接暴力了hhhh…

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
long long ans,temp;
int n,m,vis[maxn],col[maxn],res[maxn];
vector<int>vec[maxn];
void get(int u)
{
	vis[u] = 1; res[++res[0]] = u;
	for(auto v:vec[u] )
		if( !vis[v] )	get( v );
}
bool isok(int u,int color)
{
	for(auto v:vec[u] )
		if( color==col[v] )	return false;
	return true;
}
void dfs(int id)
{
	if( id==res[0]+1 ) { temp++; return; }
	for(int i=1;i<=3;i++)
	{
		if( !isok(res[id],i) )	continue;
		col[res[id]] = i;
		dfs(id+1);
		col[res[id]] = 0;
	}
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		int l,r; scanf("%d%d",&l,&r);
		vec[l].push_back( r ); vec[r].push_back( l );
	}
	long long ans = 1;
	for(int i=1;i<=n;i++)
	{
		if( vis[i] )	continue;
		temp = 0, res[0] = 0;
		get(i);//获取所有i的连通块
		dfs( 1 ); ans = ans*temp;
	}
	cout << ans;
}

以上是关于AtCoder 199 D - RGB Coloring 2(枚举,暴力)的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 199 F - Graph Smoothing(图的邻接矩阵幂的意义,数学期望,矩阵快速幂)

AtCoder Regular Contest 074 E:RGB Sequence

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道