1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#include<vector> using namespace std; const int N=200050; int col[N],n,idx[N],d[N],st,ed,cnt=0; vector<int> e[N],f[N]; inline int () { register int x=0,t=1; register char ch=getchar(); while (ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if (ch=='-') t=-1,ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t; } void dfs(int o) { idx[o]=cnt; for(int i=0;i<e[o].size();i++) { int to=e[o][i]; if (!idx[to]&&col[o]==col[to]) dfs(to); } } void find(int o,int pre,int &x) { if (o==pre) d[o]=0; if (!x||d[o]>d[x]) x=o; for(int i=0;i<f[o].size();i++) { int to=f[o][i]; if (to!=pre) { d[to]=d[o]+1; find(to,o,x); } } } int main() { n=read(); for(int i=1;i<=n;i++) col[i]=read(); for(int i=1;i<n;i++) { int u=read(),v=read(); e[u].push_back(v); e[v].push_back(u); } for(int i=1;i<=n;i++) if (!idx[i]) cnt++,dfs(i); for(int u=1;u<=n;u++) for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if (idx[u]!=idx[v]) f[idx[u]].push_back(idx[v]); } find(cnt,cnt,ed); find(ed,ed,st); printf("%dn",(d[st]+1)/2); return 0; }
|
近期评论