日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

發布時間:2024/1/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接 Permutation

題目大意:給出n,和m個關系,每個關系為ai必須排在bi的前面,求符合要求的n的全排列的個數。

數據規模為n <= 40,m <= 20。 直接狀壓DP空間肯定是不夠的。

考慮到m <= 20,說明每個連通塊的大小不超過21。

那么我們分別對每個連通塊求方案數,并且把不同的連通塊的方案數組合起來即可。

#include <bits/stdc++.h>using namespace std;#define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i)typedef long long LL;const LL mod = 1e9 + 7;const int N = 105;int n, m, s, cnt; int mp[N][N], a[N][N], b[N], col[N], pre[N]; LL c[N][N], f[1 << 22], ans; vector <int> v[N];void init(){c[0][0] = 1;rep(i, 1, N - 2){c[i][0] = 1;rep(j, 1, i - 1){c[i][j] = c[i - 1][j - 1] + c[i - 1][j];c[i][j] %= mod;}c[i][i] = 1;} }void dfs(int x){col[x] = cnt;for (auto u : v[x]){if (col[u]) continue;dfs(u);} }int main(){init();while (~scanf("%d%d", &n, &m)){rep(i, 0, n + 1) v[i].clear();memset(mp, 0, sizeof mp);memset(col, 0, sizeof col);rep(i, 1, m){int x, y;scanf("%d%d", &x, &y);v[x].push_back(y);v[y].push_back(x);mp[x][y] = 1;mp[y][x] = -1;}cnt = 0;rep(i, 1, n) if (!col[i]) ++cnt, dfs(i);memset(b, 0, sizeof b);rep(i, 1, n) a[col[i]][b[col[i]]++] = i;s = n;ans = 1;rep(i, 1, cnt){int maxS = (1 << b[i]) - 1;rep(j, 0, maxS + 2) f[j] = 0;f[0] = 1LL;memset(pre, 0, sizeof pre);rep(j, 0, b[i] - 1){rep(k, 0, b[i] - 1) if (j ^ k){if (mp[a[i][j]][a[i][k]] == 1) pre[k] |= (1 << j);}}rep(S, 0, maxS) if (f[S] > 0){rep(j, 0, b[i] - 1){if (((S & pre[j]) == pre[j]) && !(S & (1 << j))){f[S | (1 << j)] += f[S];f[S | (1 << j)] %= mod;}}}ans = ans * f[(1 << b[i]) - 1] % mod * c[s][b[i]] % mod;s -= b[i]; }printf("%lld\n", ans);}return 0; }

?

轉載于:https://www.cnblogs.com/cxhscst2/p/7360238.html

總結

以上是生活随笔為你收集整理的HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。