#include<iostream> usingnamespace std; #define ll long long int G[20][20]; ll n, m, ans; ll lowest(ll s){ int t = (s&-s); ll res = 1; while ((t & 1) == 0) { t =t>>1; res++; } return res; } ll dp[(1 << 20)][20]; intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; G[u][v] = G[v][u] = 1; } for (int i = 1; i <= n; i++) { dp[(1 << (i - 1))][i] = 1; } ll mx = (1 << n) - 1; for (ll s = 1; s <= mx; s++) { for (int now = 1; now <= n; now++) { if (dp[s][now] == 0)continue; ll st = lowest(s); for (int nex = st; nex <= n; nex++) { if ((now != nex) && G[now][nex]) { if ((s&(1 << (nex - 1)) && (nex == st))) { ans += dp[s][now]; } elseif (!(s&(1 << (nex - 1)))) { ll ss = s | (1 << (nex - 1)); dp[ss][nex] += dp[s][now]; } } } } } ans -= m; ans /= 2; cout << ans << endl; return0; }
#include<iostream> #include<vector> usingnamespace std; constint maxn = 2e5 + 5; int n, dp[maxn], ans[maxn]; structEdge { int to; int is_pos; }; vector<Edge>e[maxn]; voidadd_edge(int u, int v){ e[u].push_back({ v,1 }); e[v].push_back({ u,0 }); } voiddfs1(int now, int pre){ for (int i = 0; i < e[now].size(); i++) { int to = e[now][i].to; int flg = e[now][i].is_pos; if (to == pre) continue; dfs1(to, now); if (flg == 1)dp[now] += dp[to]; else dp[now] += (dp[to] + 1); } } voiddfs2(int now, int pre){ for (int i = 0; i < e[now].size(); i++) { int to = e[now][i].to; int flg = e[now][i].is_pos; if (to == pre) continue; if (flg == 1)ans[to] = ans[now] + 1; else ans[to] = ans[now] - 1; dfs2(to, now); } } intmain(){ cin.sync_with_stdio(false); cin >> n; for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; add_edge(u, v); } int root = 1; //规定以root为根,可以改变root,只要在n范围内 dfs1(root, -1);//从下到上更新 ans[root] = dp[root]; dfs2(root, -1);//从上到下更新 vector<int>res; int min = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { if (ans[i] < min) { min = ans[i]; res.clear(); res.push_back(i); } elseif (ans[i] == min) res.push_back(i); } cout << min << endl; for (auto c : res) { cout << c << ' '; } return0; }
#include<iostream> #include<algorithm> usingnamespace std; constint maxn = 150; int n; int c1[maxn], c2[maxn]; int sum1[maxn], sum2[maxn]; int n1, n2; intmain(){ cin >> n; for (int i = 1; i <= n; i++) { int a, b; cin >> a >> b; if (a == 1) { c1[++n1] = b; } else { c2[++n2] = b; } } sort(c1+1,c1+n1+1); sort(c2+1,c2+n2+1); for (int i = 1; i <= n1; i++) { sum1[i] = sum1[i - 1] + c1[i]; } for (int i = 1; i <= n2; i++) { sum2[i] = sum2[i - 1] + c2[i]; } int ans = 0x3f3f3f3f; for (int i = 0; i <= n1; i++) { for (int j = 0; j <= n2; j++) { int down = i + 2 * j; int up = sum1[n1 - i] + sum2[n2 - j]; if (up <= down) { ans = min(ans, down); } } } cout << ans; return0; }