• LCA的 RMQ解法模版


    struct Edge{
    	int from, to, nex;
    }edge[N<<1];
    int head[N], edgenum;
    void addedge(int u, int v){
    	Edge E = {u, v, head[u]};
    	edge[ edgenum ] = E;
    	head[u] = edgenum ++;
    }
    
    inline int Max(int a,int b){return a>b?a:b;}
    
    int time;
    int deep[N<<1], index[N<<1], first[N];
    void DFS(int u, int dep){
    	deep[time] = u;
    	index[time] =u;
    	time++;
    	for(int i = head[u]; i !=-1; i = edge[i].nex)
    	{
    		int v = edge[i].to;
    		if(first[v] == 0)
    		{
    			first[v] = time;
    			DFS(v, dep+1);
    			deep[time] = u;
    			index[time]= u;
    			time++;
    		}
    	}
    }
    int dp[N<<1][25];//注意第二维一定要比log(n)大
    void RMQ_init(int n){
    	for(int i = 1; i <= n; i++)
    		dp[i][0] = i;
    	for(int j = 1; (1<<j)<=n;j++)
    	{
    		int k = 1<<(j-1);
    		for(int i = 1; i+k<n; i++)
    		{
    			if(deep[ dp[i][j-1] ] <= deep[ dp[i+k][j-1] ])
    				dp[i][j] = dp[i][j-1];
    			else 
    				dp[i][j] = dp[i+k][j-1];
    		}
    	}
    }
    int RMQ(int a,int b){
    	int dis = Max(a-b,b-a) +1;
    	int k = log(double(dis))/ log(2.0);
    	if(deep[dp[a][k]]<= deep[dp[b - (1<<k) +1][k]])
    		return dp[a][k];
    	else
    		return dp[b-(1<<k)+1][k];
    }
    int LCA(int u, int v){
    	int fu = first[u], fv = first[v];
    	return fu<=fv? index[ RMQ(fu,fv)] : index[ RMQ(fv,fu)];
    }
    void init(){
    	memset(head, -1, sizeof(head)); edgenum = 0;
    	memset(first, 0, sizeof(first));
    }
    void Have_Lca(int root){
    	first[root] = 1;
    	time = 1;
    	DFS(root, 0);
    	RMQ_init(time-1);
    }
    


  • 相关阅读:
    C++编写ATM(2)
    【Python排序搜索基本算法】之Dijkstra算法
    Java中List转换为数组,数组转List
    [置顶] 亚信联创实习笔记
    PL/SQL 异常处理程序
    CSS position财产
    malloc()与calloc差异
    Qt5官方demo分析集10——Qt Quick Particles Examples
    栈和堆之间的差
    深入浅出JMS(一)——JMS简要
  • 原文地址:https://www.cnblogs.com/riskyer/p/3424053.html
Copyright © 2020-2023  润新知