[AtCoder] ABC 183 C – Travel
問題
方針
\( N \) 個の順列の中で先頭が \( 1 \) であるものを探索します。したがって、順列を生成して全探索します。
コード
next_permutation
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int N; ll K; cin >> N >> K; ll T[N][N]; int v[N - 1]; for (int i = 0; i < N; i++) { v[i] = i; for (int j = 0; j < N; j++) { cin >> T[i][j]; } } int cnt = 0; do { ll t = 0; for (int i = 0; i < N - 1; i++) { t += T[v[i]][v[i + 1]]; } t += T[v[N - 1]][v[0]]; if (t == K && v[0] == 0) cnt++; } while (next_permutation(v, v + N)); cout << cnt << "\n"; return 0; }
ライブラリなし
#include <bits/stdc++.h> using namespace std; typedef long long ll; int cnt = 0; int N, K; int a[9]{}, flag[9]{}; int T[9][9]{}; void check() { int t = 0; for (int i = 0; i < N; i++) { t += T[a[i]][a[i + 1]]; // a[N] = 0 } if (t == K) cnt++; } void solve(int n) { if (n == N) { check(); return; } for (int i = 1; i < N; i++) { if (flag[i]) continue; a[n] = i; flag[i] = 1; solve(n + 1); flag[i] = 0; } } int main() { cin >> N >> K; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> T[i][j]; } } a[0] = 0; flag[0] = 1; solve(1); cout << cnt << "\n"; return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません