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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)

發布時間:2023/12/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[洛谷 P4084 USACO17DEC] Barn Painting G


題目鏈接


大致題意:

給定一顆N個節點組成的樹,3種顏色,其中K個節點已染色,要求任意兩相鄰節點顏色不同,求合法染色方案數


解題思路:

  • f[i][j]表示i這個點上色為j是方案數(從下往上/從子節點向父節點更新

  • 即對于所有初始節點,f[i][1],f[i][2],f[i][3]都為1

  • 當某個節點被指定上色后,那么該節點另外兩種顏色的方案數為0。

    列如:當點x被指定上色 2 時:f[x][1]=0,f[x][3]=0 (因為無法上色1和3)

  • 對于每個節點,因為不能于子節點上色相同,即:

f[u][1] = f[u][1] * ((f[v][2] + f[v][3]) % mod) % mod; f[u][2] = f[u][2] * ((f[v][1] + f[v][3]) % mod) % mod; f[u][3] = f[u][3] * ((f[v][1] + f[v][2]) % mod) % mod;
  • 最后,記得取模和開long long

AC代碼:

#include <bits/stdc++.h> #define rep(i, n) for (int i = 1; i <= (n); ++i) using namespace std; typedef pair<int, int> PII; typedef long long ll; const int N = 1e5 + 10, mod = 1e9 + 7; int n, m; vector<int>e[N]; ll f[N][5]; //i點涂j顏色的方案數 void dfs(int u, int fa) {//初始化for (int i = 1; i <= 3; ++i) {if (f[u][i]) {for (int j = 1; j < i; ++j)f[u][j] = 0;break;}f[u][i] = 1;}for (auto& v : e[u]) {if (v == fa)continue;dfs(v, u);f[u][1] = f[u][1] * ((f[v][2] + f[v][3]) % mod) % mod;f[u][2] = f[u][2] * ((f[v][1] + f[v][3]) % mod) % mod;f[u][3] = f[u][3] * ((f[v][1] + f[v][2]) % mod) % mod;} } int main(void) {cin >> n >> m;for (int i = 1; i < n; ++i) {int a, b; cin >> a >> b;e[a].push_back(b);e[b].push_back(a);}while (m--) {int a, b; cin >> a >> b;f[a][b] = 1;}dfs(1, -1);ll res = (f[1][1] + f[1][2] + f[1][3]) % mod;cout << res << endl;return 0; }

總結

以上是生活随笔為你收集整理的[洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)的全部內容,希望文章能夠幫你解決所遇到的問題。

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