Submission #894867

#TimeUsernameProblemLanguageResultExecution timeMemory
894867vjudge1Mergers (JOI19_mergers)C++17
10 / 100
101 ms1104 KiB
#include <bits/stdc++.h> using namespace std; const int mxn=1e2+5; int n,k,mark[8],comp[8],par[mxn],s[mxn],ans=10,sum[mxn][8],sz[8],szz[8]; vector<int>v[mxn]; bool dfs(int z,int x){ bool res=1; for(int j=1;j<=x;j++) sum[z][j]=0; sum[z][comp[s[z]]]++; for(auto i:v[z]){ if(par[z]!=i){ par[i]=z; res&=dfs(i,x); for(int j=1;j<=x;j++) sum[z][j]+=sum[i][j]; } } bool cnt=1; for(int j=1;j<=x;j++){ if(sum[z][j]==szz[j] || sum[z][j]==0)cnt=1; else{ cnt=0; break; } } if(cnt && z!=1)return 0; return res; } void solve(int i,int x){ if(i>k){ for(int j=1;j<=x;j++){ if(!mark[j])return ; } if(dfs(1,x)){ ans=min(ans,k-x); } return ; } for(int j=1;j<=x;j++){ comp[i]=j; mark[j]++; szz[j]+=sz[i]; solve(i+1,x); mark[j]--; szz[j]-=sz[i]; } } int main(){ cin>>n>>k; for(int i=1;i<n;i++){ int x,y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } for(int i=1;i<=n;i++){ cin>>s[i]; sz[s[i]]++; } for(int i=k;i>=1;i--){ solve(1,i); } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...