description
響應主旋律的號召,大家決定讓這個班級充滿愛,現在班級裡面有 n 個男生。
如果 a 愛著 b,那麼就相當於 a 和 b 之間有一條 a→b 的有向邊。如果這 n 個點的圖是強聯通的,那麼就認為這個班級是充滿愛的。
不幸的是,有一些不好的事情發生了,現在每一條邊都可能被摧毀。我作為愛的使者,想知道有多少種摧毀的方式,使得這個班級任然充滿愛呢?(說人話就是有多少邊的子集刪去之後整個圖仍然強聯通。)
input
第一行兩個數 n 和 m,表示班級裡的男生數和愛的關係數。
接下來 m 行,每行兩個數 a 和 b,表示男生 a 愛著男生 b。同時 a 不等於 b。
所有男生從 1 到 n 標號。
同一條邊不會出現兩遍,但可能出現 a 愛著 b,b 也愛著 a 的情況,這是兩條不同的邊。
output
輸出一行乙個整數,表示對 109+7 取模後的答案。
sample input
5 15
4 34 2
2 52 1
1 25 1
3 24 1
1 45 4
3 45 3
2 31 5
3 1
sample output
9390
hint
對於 100% 的資料滿足: n≤15,0≤m≤n(n−1)。
source
2023年國家集訓隊測試
一道很傳統的題目.
首先很容易想到是狀壓dp.
題目所求的東西,可以轉化為乙個問題:」原圖有多少個子圖是強連通的.」
這個問題本身不太好做,但是我們可以考慮從他的對立面」多少子圖是不強連通的」入手.
顯然如果乙個子圖是不強連通的,那麼他縮點後一定是乙個節點數目大於等於2的dag.
所以可以用總方案數減掉能劃分出縮點後節點數目大於等於2的方案數,只要列舉有多少點點集縮點後是乙個dag,然後dp就行了.
既然選取的點集縮點後一定是個dag,那麼接下來的問題就變成了:給定一張有向圖,有多少種選邊方案使得選出來的子圖構成乙個dag.
那麼我們考慮列舉乙個點集v,列舉出度為0的點集v』.然後可以容斥+dp.容斥過程中可以發現,如果v』中選的點縮完是奇數個點,對答案貢獻是正的,否則是負的.然後只要算出奇數個點的方案減去偶數個點的方案就行了.
然而到這裡還是只能在原題得70分…最後還要預處理乙個 點集劃分成奇數個沒有出度的點減去偶數個沒有出度的點 的方案數.
我的題解可能比較碎而且看不懂..可以看po姐的**裡的注釋,更加直接..
#include
#include
#include
#include
#include
#define p 1000000007
#define maxn 16
#define get (ch>='0'&&ch<='9')
using namespace std;
int n,m;
int bit[1
<1
<1
<1
int pow[maxn*maxn];
inline void in(int &x)
int main()
int sum=0;//edge number
for (int j=0;jif (i&(1
<0;
intx=use[i],v=i-(1
int sum=0;
for (int j=i;j;(--j)&=i)
int edgecnt=tmp[j],t=1ll*g[j]*h[i-j]%p
*pow[edgecnt]%p;
(sum+=t)%=p;
}((f[i]-=sum)+=p)%=p;(g[i]+=f[i])%=p;
}cout<1
<1]<}
清華集訓 2014 玄學
update text update 我之前講的是個什麼鬼 如果想看看人話版本 戳這。感覺自己被坑騙了。題目明明寫了所有資料不超過int,敢情是輸入資料不超int?迷惑行為 題目感覺有點繞,我盡量 不口胡。首先我們搞一顆線段樹1,樹表示插入序列的編號。如,在q行中第i個出現插入操作 其實拿到這道題我...
清華集訓2014 mex
有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。考慮用線段樹維護,維護什麼?我們把這些點分布在數軸上,那麼我們要在這個數軸上找到答案,就要把區間轉換到數軸上,也就是要維護每個數的下標。那麼滿足維護這個東西的,可以用權值線段樹。這樣,我們可以衍生出兩種做法 離線做法 把所有的...
46 清華集訓2014 玄學
一開始腦子進水了 把這題想簡單了 複雜度算錯了 每次都用nlogn的時間修改 而且還狂寫stl 然後就直播自爆8小時qaq。先掛個5分 include include include include include includeusing namespace std define rep i,j,...