題目
歐貝利斯克的巨神兵很喜歡有向圖,有一天他找到了一張\(n\)個點\(m\)條邊的有向圖。
歐貝利斯克認為乙個沒有環的有向圖是優美的,請問這張圖有多少個子圖(即選定乙個邊集)是優美的?
答案對\(10^9+7\)取模。
對於40%的資料\(n≤5,m≤20\)
對於60%的資料\(n≤10\);
對於80%的資料\(n≤15\);
對於100%的資料\(n≤17\)。
思路考場上只會寫列舉邊集的純暴力,後來發現自己蠢爆了。
首先這題的關鍵在於如何設計出乙個演算法,把複雜度堆在點數上而不是邊上,之後所做的工作都是在此基礎之上進行優化。
看看在40分的暴力中,判環時用了拓撲排序,考慮以拓撲排序為基礎對原圖分層。
p60定義\(dp[i][j]\)表示當前已經使用了哪些點,最後一層有哪些點,一層層的轉移,每一層內部不能有邊,層與層之間的邊可選可不選。
struct p60
struct p60
void solve()
add(dp[i|k][k],tmp*dp[i][j]%mod);}}
} int ans=0;
for(int i=1;i<=base;i++)
add(ans,dp[base][i]);
printf("%d\n",ans);
}}p60;
struct p100
void solve()}}
int to=(base^i);
for(int t=(to&(to-1));;t=(t-1)&to)
} printf("%d\n",dp[base]);
}}p100;
int main()
p100.solve();
return 0;
}
日常訓練 巨神兵 obelisk
題意簡述 有一張 n 個點,m條邊的有向圖,有多少個子圖 選定乙個邊集 是沒有環的。答案對1e 9 7 取模。n 10 考慮狀壓dp,乙個無環圖一定是可以唯一分層的,將一開始入度為 0 的點放第一層,將這些點去掉,剩下出現的新的入度為 0的點為第二層 以此類推,用f i j 表示已經取得點集為 i ...
CSP模擬賽 方程(數學)
題目描述 求關於x的方程 x1 x2 xk n的非負整數解的個數。輸入格式 僅一行,包含兩個正整數n,k。輸出格式 乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814 的結果。輸入樣例 1 1輸出樣例1提示 資料範圍 對於50 的資料,n,k 300 對於80 的資料...
CSP模擬賽 方程(數學)
求關於x的方程 x1 x2 xk n的非負整數解的個數。僅一行,包含兩個正整數n,k。乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814 的結果。1 11 提示資料範圍 對於50 的資料,n,k 300 對於80 的資料,n,k 1000 對於100 的資料,n,k ...