1 solutions

  • 0
    @ 2025-11-27 11:59:57

    C++ :

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N=2e5+15;
    int col[N];
    int e[N],ne[N],h[N],idx,w[N];
    int f[N],g[N],mxl;
    int n;
    int dfn[N],timestamp;
    void add_in(int x,int y,int z){
    	e[++idx]=y; ne[idx]=h[x]; w[idx]=z; h[x]=idx;
    } 
    void dfs(int u,int fa){ //树的直径
    	dfn[u]=++timestamp; //记录一下访问了该节点
    	int v;
    	f[u]=0;
    	for(int i=h[u];i;i=ne[i]){
    		v=e[i];
    		if(v==fa) continue;
    		dfs(v,u);
    		mxl=max(mxl,f[u]+f[v]+w[i]);
    		f[u]=max(f[u],f[v]+w[i]);
    	} 
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>col[i];
    	}
    	int x,y;
    	for(int i=1;i<n;i++){
    		cin>>x>>y;
    		if(col[x]==col[y]) continue; //两点颜色相同则不用建边
    		add_in(x,y,1);
    		add_in(y,x,1);
    	}
    	int res=0;
    	for(int i=1;i<=n;i++){
    		if(!dfn[i]) //该节点未被访问过
    			dfs(i,0);
    	}
    	cout<<mxl+1<<endl; //因为树的直径计算的是经过边的条数,因此需+1
    	return 0;
    } 
    
    

    Information

    ID
    147
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By