傳送門php
題目ios
Inputspa
Outputcode
分析blog
這個題最多有三種值(我也不知道爲啥),在知道這個以後咱們進行樸素的樹形dp便可,dpij表示第i個點的值爲j。get
代碼string
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack>
using namespace std; int dp[10010][10]; vector<int>v[10010]; inline void go(int x,int fa){ dp[x][1]=1,dp[x][2]=2,dp[x][3]=3; for(int i=0;i<v[x].size();i++) if(v[x][i]!=fa){ go(v[x][i],x); dp[x][1]+=min(dp[v[x][i]][2],dp[v[x][i]][3]); dp[x][2]+=min(dp[v[x][i]][1],dp[v[x][i]][3]); dp[x][3]+=min(dp[v[x][i]][1],dp[v[x][i]][2]); } return; } int main() { int n,m,i,j,k,x,y; scanf("%d",&n); for(i=1;i<n;i++){ scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } go(1,0); printf("%d\n",min(dp[1][1],min(dp[1][2],dp[1][3]))); return 0; }