問題
バグの内容
==12591==ERROR: AddressSanitizer: heap-use-after-free on address 再帰関数内で参照をしたまま変数を書き換えたらバグった.もしバグった原因が原因が分かる方がいたら教えてください. ↓ 連絡先
コード
#include <bits/stdc++.h> using namespace std; using ll = long long; void solve([[maybe_unused]] int test) { ll n, t, m; cin >> n >> t >> m; vector<ll> a(m), b(m); vector not_friend(n, vector<bool>(n)); for (ll i = 0; i < m; i++) { cin >> a[i] >> b[i]; a[i]--, b[i]--; not_friend[a[i]][b[i]] = true; not_friend[b[i]][a[i]] = true; } ll ans = 0; vector<vector<ll>> teams; auto dfs = [&](auto&& self, ll added) -> void { if (added == n) { ll sz = teams.size(); if (sz == t) { ans++; } return; } /* バグる */ // for (auto&& tmp_team : teams) { // ll can_join = all_of(tmp_team.begin(), tmp_team.end(), [&](ll z) { return !not_friend[added][z]; }); // if (can_join) { // tmp_team.push_back(added); // self(self, added + 1); // tmp_team.pop_back(); // } // } /* これならOK */ for (ll i = 0; i < teams.size(); i++) { ll can_join = all_of(teams[i].begin(), teams[i].end(), [&](ll z) { return !not_friend[added][z]; }); if (can_join) { teams[i].push_back(added); self(self, added + 1); teams[i].pop_back(); } } teams.push_back({added}); self(self, added + 1); teams.pop_back(); }; dfs(dfs, 0); cout << ans << endl; } int main() { cin.tie(nullptr), ios::sync_with_stdio(false), cout << fixed << setprecision(12); int testcase_size = 1; // cin >> testcase_size; for (int _t = 0; _t < testcase_size; _t++) { solve(_t); } }