題意簡述:有一張
n 個點,
m條邊的有向圖,有多少個子圖(選定乙個邊集)是沒有環的。答案對1e
9+7 取模。n≤
10
考慮狀壓dp,乙個無環圖一定是可以唯一分層的,將一開始入度為
0 的點放第一層,將這些點去掉,剩下出現的新的入度為
0的點為第二層…以此類推,用f[
i][j
] 表示已經取得點集為
i ,最後一層點集為
j,列舉新的點集
k 。集合
k中的每乙個點必須至少被一條來自集合
j 的點連,但來自其他集合
i中的點到
k 的邊可以任意連。dp轉移即可。因為每個點只有
4個狀態,已被取不是最後一層,已被取是最後一層,新取的點,還未取得點,所以複雜度是o(
4nm)
。 最近轉c++,看起來神清氣爽
#include
typedef
long
long ll;
using
namespace
std;
const
int n=100,p=1000000007;
int x[n],y[n],trans[10000],a[n],n,m;
ll f[1050][1050],m2[n];
int main()
ll base = 1;
for (int l = 1;l <= n;l++)
base = base * m2[a[0]] % p;
f[i | k][k] = (f[i | k][k] + f[i][j] * base) % p;}}
ll ans = 0;
for (int i = 1;i <= all;i++)
ans = (ans + f[all][i]) % p;
printf("%lld\n",ans);
}
CSP模擬賽 巨神兵
題目 歐貝利斯克的巨神兵很喜歡有向圖,有一天他找到了一張 n 個點 m 條邊的有向圖。歐貝利斯克認為乙個沒有環的有向圖是優美的,請問這張圖有多少個子圖 即選定乙個邊集 是優美的?答案對 10 9 7 取模。對於40 的資料 n 5,m 20 對於60 的資料 n 10 對於80 的資料 n 15 對...
日常訓練 壓縮
巨大的文字往往令人頭疼,特別是文字內容有大量重複的情況下,巨大的文字不便於運輸和閱讀,於是我們提出了noip nonsense obivous index pattern 荒謬的顯然索引法 一種 有效的 壓縮文字的方法。noip壓縮後的格式很特別,乙個文字壓縮後由若干個單元組成,每個單元由3部分組成...
日常訓練 Tree
j 對於h u j 時間複雜度的證明也是比較經典了,每次列舉的是sz eu s zev 相當於每次從a,b 中各任選一點,它們的lc a 為 u 這樣的點對列舉不會重複,因此總的時間複雜度為o n2 include include include include include using name...