AtCoder 199 D - RGB Coloring 2(枚举,暴力)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder 199 D - RGB Coloring 2(枚举,暴力)相关的知识,希望对你有一定的参考价值。
觉得自己又脑瘫了
暴力枚举每个点的颜色复杂度是 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(图的邻接矩阵幂的意义,数学期望,矩阵快速幂)