zoukankan      html  css  js  c++  java
  • C

    //#include<bits/stdc++.h>
    //#pragma comment(linker, "/STACK:1024000000,1024000000") 
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<set>
    #include<map>
    #include<vector>
    #include<iomanip>
    using namespace std;
    #define ll long long
    #define pb push_back
    
    const int maxn=4e4+9;
    
    int cnt;
    struct EDGE{int v;int d;};
    vector<EDGE>G[maxn];
    
    int vs[maxn*2-1];	//每次访问到的节点
    int dep[maxn*2-1];	//节点深度
    int id[maxn];		//编号节点第一次访问的时间
    
    void init(int n){
    for(int i=1;i<=n;i++)G[i].clear();
    cnt=0;
    }
    
    void addedge(int u,int v,int d){
    	G[u].pb((EDGE){v,d});
    	G[v].pb((EDGE){u,d});
    }
    
    void dfs(int u,int fa,int d){
    	id[u]=++cnt;
    	vs[cnt]=u;dep[cnt]=d;
    	int sz=G[u].size();
    	for(int i=0;i<sz;i++){
    		EDGE &e=G[u][i];
    		if(e.v==fa)continue;
    		dfs(e.v,u,d+e.d);	
    		vs[++cnt]=u;dep[cnt]=d;
    	}
    }
    
    int dp[maxn<<1][20];
    void init_rmq(int n,int dep[]){
    	for(int i=1;i<=n;i++)dp[i][0]=i;
    	for(int j=1;(1<<j)<=n;j++){
    		for(int i=1;i+(1<<j)-1<=n;i++){
    			int a=dp[i][j-1],b=dp[i+(1<<(j-1))][j-1];
    			dp[i][j]=dep[a]<dep[b]?a:b;
    		}
    	}
    }
    int rmq(int l,int r){
    	if(l>r)swap(l,r);
    	int ph=0;
    	while((1<<(ph+1)) <= r-l+1)ph++;
    	return dep[dp[l][ph]]<=dep[dp[r-(1<<ph)+1][ph]]?
    		dp[l][ph]:dp[r-(1<<ph)+1][ph];
    }
    
    int lca(int u,int v){
    	return vs[rmq(id[u],id[v])];
    }
    /*******************************************************************************************************************/
    int fa[maxn];
    void ufs_init(int n){
    	for(int i=0;i<=n;i++)fa[i]=i;
    }
    int find(int x){
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void unite(int x,int y){
    	int a=find(x),b=find(y);
    	if(a!=b)fa[a]=b;
    }
    
    int main(){
    	int n,m,c;
    	while(scanf("%d%d%d",&n,&m,&c)!=EOF){//城市数,边数,查询数
    		for(int i=0;i<=n;i++)G[i].clear();
    		cnt=0;
    
    		int u,v,d;
    		ufs_init(n);
    		for(int i=1;i<=m;i++){
    			scanf("%d%d%d",&u,&v,&d);
    			unite(u,v);
    			addedge(u,v,d);		
    		}
    		for(int i=1;i<=n;i++){
    			if(find(i)==i){
    				dfs(i,-1,0);
    			}
    		}
    		
    		init_rmq(2*n-1,dep);
    
    		for(int i=1;i<=c;i++){
    			scanf("%d%d",&u,&v);
    			if(find(u)!=find(v)){
    				printf("Not connected
    ");
    			}else{
    				printf("%d
    ",dep[id[u]]+dep[id[v]]-2*dep[id[lca(u,v)]]);
    			}
    		}
    	}
    }
    这次的板子应该没问题了。。。。。。
  • 相关阅读:
    Android随笔
    Android随笔
    阅读笔记
    Android随笔
    Android随笔
    Android随笔
    Android随笔
    Java随笔
    Android随笔
    NC20265 着色方案(dp)
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611302.html
Copyright © 2011-2022 走看看