寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #D - RGB Coloring 2

AtCoder Beginner Contestの過去問から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#D - RGB Coloring 2

atcoder.jp

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#D - RGB Coloring 2
https://atcoder.jp/contests/abc199/tasks/abc199_d
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=30;
ll n,m,sum,v[N],num[N];
bool tf[N],tf2[N][N];
ll ans=1,a;
void f(ll x){
  if(!tf[x]){
    tf[x]=true;
    v[++sum]=x;
    for(ll i=1;i<=n;i++){
      if(tf2[x][i]){
        f(i);
      }
    }
  }
}
void f2(ll x){
  if(x>sum){
    a++;
    return;
  }
  bool is[4]={false,false,false,false};
  for(ll i=1;i<x;i++){
    if(tf2[v[x]][v[i]]){
      is[num[v[i]]]=1;
    }
  }
  for(ll i=1;i<=3;i++){
    if(!is[i]){
      num[v[x]]=i;
      f2(x+1);
    }
  }
}
int main(void){
  cin>>n>>m;
  for(ll i=1,x,y;i<=m;i++){
    cin>>x>>y;
    tf2[x][y]=tf2[y][x]=1;
  }
  for(ll i=1;i<=n;i++){
    if(!tf[i]){
      a=sum=0;
      f(i);
      f2(1);
      ans*=a;
    }
  }
  cout<<ans<<endl;
  return 0;
}

AtCoder Beginner Contestは、オンラインジャッジによるプログラミングコンテストです。
日本語と英語に対応していて、週末ごとに実施されているみたいです。
https://practice.contest.atcoder.jp/tutorial
アカウントを登録すれば、誰でも参加できます。