提交时间:2024-10-20 14:38:30
运行 ID: 33711
#include <bits/stdc++.h> #define int long long using namespace std; const int md = 998244353; int n,x[114]; vector <pair <int,int> > e; bool b[114]; int fa[514]; int fd (int u,int v) { int sz = e.size(); for (int i = 0;i < sz;i++) { if (e[i].first == u && e[i].second == v) { return i; } if (e[i].first == v && e[i].second == u) { return i; } } return -1; } int ff (int x) { if (fa[x] == x) { return x; } fa[x] = ff(fa[x]); return fa[x]; } bool mg (int x,int y) { if (ff(x) == ff(y)) { return true; } fa[ff(x)] = ff(y); return false; } bool chk (int z) { int sz = e.size(); for (int i = 0;i <= 2 * n;i++) { fa[i] = i; } for (int i = 0;i < sz;i++) { if (z & (1 << i)) { if (mg(e[i].first,e[i].second)) { return false; } } } for (int i = 1;i <= n;i++) { if (ff(i) != ff(1)) { return false; } } for (int i = n + 1;i <= n * 2;i++) { if (b[i - n]) { if (ff(i) != ff(1)) { return false; } } } return true; } signed main () { cin >> n; if (n > 30) { cout << "rwps AK jp8" << endl; return 0; } for (int i = 1;i < n;++i) { int u,v; cin >> u >> v; e.push_back(make_pair(u,v)); } for (int i = 1;i < n;++i) { cin >> x[i]; b[x[i]] = 1; for (int j = 1;j <= n;++j) { if (fd(x[i],j) < 0) { continue; } if (b[j]) { int f = fd(j + n,x[i]); // cout << f << ' ' << x[i] << ' ' << j << endl; e[f] = make_pair(j + n,x[i] + n); } else { e.push_back(make_pair(x[i] + n,j)); } } int sz = e.size(),ans = 0; for (int j = 0;j < (1 << sz);j++) { ans += chk(j); ans %= md; } cout << ans << endl; } return 0; }