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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<vector> using namespace std; int f[200005]; int find(int x) { if(x==f[x])return x; else return f[x]=find(f[x]); } void un(int x,int y) { int a=find(x); int b=find(y); if(a==b)return ; else { f[a]=b; } } int col[200005]; int vis[200005]; int u[200005],v[200005]; vector<int >g[200005]; int ans=0; int st; void dfs(int u,int deep,int fa) { if(deep>ans) { ans=deep; st=u; } int l=g[u].size(); int rt=0; for(int i=0;i<l;i++) { if(g[u][i]==fa)continue; dfs(g[u][i],deep+1,u); } return; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=n;i++)scanf("%d",&col[i]); for(int i=1;i<=n-1;i++) { scanf("%d%d",&u[i],&v[i]); if(col[u[i]]==col[v[i]]) { un(u[i],v[i]); } } for(int i=1;i<=n-1;i++) { if(col[find(u[i])]!=col[find(v[i])]) { g[find(u[i])].push_back(find(v[i])); g[find(v[i])].push_back(find(u[i])); } } { printf("%d: ",i); for(int j=0;j<g[i].size();j++) printf("%d ",g[i][j]); printf("\n"); }*/ dfs(find(1),1,-1); ans=0; dfs(st,1,-1); printf("%d\n",ans/2); return 0; }
|