ABC054 C - One-stroke Path

Calendar Clock iconCalendar Clock icon

atcoder

目次

# 問題

https://atcoder.jp/contests/abc054/tasks/abc054_c

# 入力

N M
a_0 b_0
a_1 b_1
...
a_M b_M
  • N - 頂点数(2N82 \leq N \leq 8)
  • M - 辺数(0MN(N1)/20 \leq M \leq N(N-1)/2)
  • a_i, b_i 無向辺の頂点

# 出力

頂点1からすべての頂点をちょうど1回ずつ訪問する組み合わせはいくつあるかを答える問題です.

# 解説

先頭の1だけ固定してそれ以外の頂点を適当に並べます.
そして先頭から末尾まで頂点を辿っていって頂点間をつなぐ辺がすべて存在する場合はカウントします.
1箇所でも途切れている辺があればそれはカウントしません.
これをすべての頂点の並べ方の数だけ試してみれば答えが求まります.
頂点数はNNなので、先頭の1は固定でその並べ方は(N1)!(N-1)!通りです.
C++ではnext_permutation関数ですべての並べ方を順番に生成することが出来ます.

Nが十分小さいのでこれで間に合います.

# 計算量

頂点間に辺が存在するかの確認は頂点を先頭から1つずつ見ていくので計算量O(N1)O(N-1)です.
それを(N1)!(N-1)!通りだけ繰り返します.

O((N1)!(N1))O((N-1)! \cdot (N-1))

# 解答

// C++ 14
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <math.h>

#define ll long long
#define Int int
#define loop(x, start, end) for(Int x = start; x < end; x++)
#define loopdown(x, start, end) for(int x = start; x > end; x--)
#define rep(n) for(int x = 0; x < n; x++)
#define span(a,x,y) a.begin()+x,a.begin()+y
#define span_all(a) a.begin(),a.end()
#define len(x) (x.size())
#define last(x) (*(x.end()-1))

using namespace std;
#define MAX_N 8
#define MAX_M (8*7*0.5)

Int N, M;
vector<vector<Int> > G(MAX_N, vector<Int>(MAX_N, 0));

void input() {
  cin >> N >> M;
  Int u, v;
  loop(m,0,M) {
    cin >> u >> v;
    u--,v--;
    G.at(u).at(v) = 1;
    G.at(v).at(u) = 1;
  }
}

Int bit() {
  vector<Int> path;
  loop(n,0,N) path.push_back(n);
  Int numPaths = 0;
  do {
    bool ok = true;
    loop(i,1,path.size()) {
      if (!G.at(path.at(i-1)).at(path.at(i))) {
        ok = false;
        break;
      }
    }
    if (ok) numPaths++;
  } while (next_permutation(path.begin()+1, path.end()));
  return numPaths;
}

void solve() {
  cout << bit() << endl;
}

int main(void) {
  input();
  solve();
  return 0;
}

リモートフリーランス。ウェブサービス、スマホアプリエンジニア。
東アジアを拠点に世界を移動しながら活動してます!

お仕事のご依頼・お問い合わせはこちら

コメント