[USACO 2017 Dec Gold] Tutorial
阿新 • • 發佈:2018-09-04
problem bits c++ first php fin play aps spl
Link:
USACO 2017 Dec Gold 傳送門
A:
B:
將無根樹轉化為有根樹方便計數
明顯樹形$dp$,轉移$dp[i][j]=\prod_{k\in son} dp[k][(j+1)mod3]+dp[k][(j+2)mod3]$
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> P; const int MAXN=1e5+10,MOD=1e9+7; structProblem Bedge{int nxt,to;}e[MAXN<<2]; int n,k,x,y,head[MAXN],tot;ll dp[MAXN][3]; void add_edge(int x,int y) {e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;} void dfs(int x,int anc) { for(int i=head[x];i;i=e[i].nxt) { if(e[i].to==anc) continue; dfs(e[i].to,x); for(int j=0;j<3;j++) (dp[x][j]*=dp[e[i].to][(j+1)%3]+dp[e[i].to][(j+2)%3])%=MOD; } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add_edge(x,y),add_edge(y,x); for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=dp[i][2]=1;for(int i=1;i<=k;i++) scanf("%d%d",&x,&y),y--,dp[x][(y+1)%3]=dp[x][(y+2)%3]=0; dfs(1,0); printf("%lld",(dp[1][0]+dp[1][1]+dp[1][2])%MOD); return 0; }
C:
[USACO 2017 Dec Gold] Tutorial