洛谷P3349 ZJOI2016 小星星

2022-05-16 06:46:22 字數 1656 閱讀 9977

小y是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有n顆小星星,用m條彩色的細線串了起來,每條細線連著兩顆小星星。

有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了n-1條細線,但通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線形成了樹。小y找到了這個飾品的設計圖紙,她想知道現在飾品中的小星星對應著原來圖紙上的哪些小星星。如果現在飾品中兩顆小星星有細線相連,那麼要求對應的小星星原來的圖紙上也有細線相連。小y想知道有多少種可能的對應方式。

只有你告訴了她正確的答案,她才會把小飾品做為禮物送給你呢。

第一行包含個2正整數n,m,表示原來的飾品中小星星的個數和細線的條數。接下來m行,每行包含2個正整數u,v,表示原來的飾品中小星星u和v通過細線連了起來。這裡的小星星從1開始標號。保證u≠v,且每對小星星之間最多只有一條細線相連。接下來n-1行,每行包含個2正整數u,v,表示現在的飾品中小星星u和v通過細線連了起來。保證這些小星星通過細線可以串在一起。n<=17,m<=n*(n-1)/2

輸出共1行,包含乙個整數表示可能的對應方式的數量。如果不存在可行的對應方式則輸出0。

4 31 2

1 31 4

4 14 2

4 3首先考慮暴力中的暴力:直接列舉樹上的點對應的原圖上點的序號,再驗證是否可行。

顯然這個暴力沒有多大的意義,但它可以作為正解的啟發。設 \(f_\) 表示考慮 \(i\) 的子樹,且 \(i\) 對應原圖上的 \(j\) 的方案數。那麼 \(i\) 的所有子節點必須在原圖上對應與 \(j\) 相連。我們可以得到如下轉移方程:

\[f_=\prod_\ \ \sum_^n f_\times g_

\]其中 \(g\) 是原圖的鄰接矩陣。但是,這樣做沒有考慮不能重複對映的條件。最後對映集合中的點可能少於 \(n\) 個。那接下來我們可以強制只能對映到 \(n-1\) 個點,然後用總方案數減去這裡計算得到的方案數。在這個過程中,我們又會遇到一樣的問題,我們要把多減的加回來。因此通過容斥原理,我們列舉對映集合,每次從圖上刪除不在對映集合裡的點,然後 \(o(n^3)\) dp即可。

#include #include #define n 22

using namespace std;

int head[n],ver[n*2],nxt[n*2],l;

int n,m,i,j;

long long f[n][n],ans;

bool g[n][n],g1[n][n],vis[n];

int read()

return w;

}void insert(int x,int y)

void dp(int x,int pre)

f[x][j]*=tmp;

}} }

}void dfs(int x)

} dp(1,0);

if(cnt%2==0)

else

for(int i=1;i<=n;i++)

return;

} dfs(x+1);

vis[x]=1;dfs(x+1);vis[x]=0;

}int main()

for(i=1;ifor(i=1;i<=n;i++)

dfs(1);

printf("%lld\n",ans);

return 0;

}

洛谷P3348 ZJOI2016 大森林

小y家裡有乙個大森林,裡面有n棵樹,編號從1到n。一開始這些樹都只是樹苗,只有乙個節點,標號為1。這些樹都有乙個特殊的節點,我們稱之為生長節點,這些節點有生長出子節點的能力。小y掌握了一種魔法,能讓第l棵樹到第r棵樹的生長節點長出乙個子節點。同時她還能修改第l棵樹到第r棵樹的生長節點。她告訴了你她使...

洛谷 P2607 ZJOI2008 騎士

給出一幅有n個點,n條邊的無向未必聯通圖,每乙個點有乙個權並與另外乙個點相連,對其中一些點進行染色,且相鄰兩點的顏色不能都染,則最大的染色點權值和是多少.這題和 洛谷p1453城市環路 很像,區別就在於它不是連通圖.因而可以先用並查集和vector進行分塊,易證每一塊都是比樹多一條邊的連通圖,每一塊...

洛谷P2610 ZJOI2012 旅遊

到了難得的暑假,為了慶祝小白在數學考試中取得的優異成績,小藍決定帶小白出去旅遊 經過一番抉擇,兩人決定將t國作為他們的目的地。t國的國土可以用乙個凸n邊形來表示,n個頂點表示n個入境 出境口。t國包含n 2個城市,每個城市都是頂點均為n邊形頂點的三角形 換而言之,b 城市組成了關於t國的乙個三角剖分...