zoukankan      html  css  js  c++  java
  • 点分治模板 POJ 1741

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6+5;
    struct asd{
    	int from,to,next,val;
    }b[maxn];
    int head[maxn],tot=1;
    void ad(int aa,int bb,int cc){
    	b[tot].from=aa;
    	b[tot].to=bb;
    	b[tot].val=cc;
    	b[tot].next=head[aa];
    	head[aa]=tot++;
    }
    int n,k,ans,Tsiz,Root;
    int siz[maxn],wt[maxn],a[maxn];
    bool vis[maxn];
    int cnt;
    void get_root(int now,int fa){
    	siz[now]=1;
    	wt[now]=0;
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		if(vis[u] || u==fa) continue;
    		get_root(u,now);
    		siz[now]+=siz[u];
    		wt[now]=max(wt[now],siz[u]);
    	}
    	wt[now]=max(wt[now],Tsiz-siz[now]);
    	if(wt[Root]>wt[now]) Root=now;
    	//printf("Root=%d
    ",Root);
    }
    void dfs(int now,int fa,int d){
    	a[++cnt]=d;
    	//printf("%d %d
    ",now,a[cnt]);
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		//printf("%d %d
    ",now,cnt);
    		if(u!=fa && !vis[u]) dfs(u,now,d+b[i].val);
    	}
    }
    int js(int now,int d){
    	cnt=0;
    	dfs(now,0,d);
    	sort(a+1,a+cnt+1);
    	/*for(int i=1;i<=cnt;i++){
    		printf("%d %d
    ",now,a[i]);
    	}*/
    	//printf("now=%d cnt=%d
    ",now,cnt);
    	int sum=0;
    	for(int i=1,j=cnt;;i++){
    		//printf("now=%d a[%d]=%d a[%d]=%d
    ",now,i,a[i],j,a[j]);
    		while(j && a[i]+a[j]>k) j--;
    		if(i>j) break;
    		sum+=j-i+1;
    	}
    	//printf("sum=%d
    ",sum);
    	return sum;
    }
    void dfss(int now){
    	//printf("ans=%d
    ",ans);
    	ans+=js(now,0);
    	vis[now]=1;
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		if(!vis[u]){
    			ans-=js(u,b[i].val);
    			Root=0;
    			Tsiz=siz[u];
    			get_root(u,0);
    			dfss(Root);
    		}
    	}
    }
    int main(){
    	while(scanf("%d%d",&n,&k)!=EOF && n){
    		ans=0;
    		tot=1;
    		memset(head,-1,sizeof(head));
    		memset(&b,0,sizeof(struct asd));
    		memset(vis,0,sizeof(vis));
    		for(int i=1;i<n;i++){
    			int aa,bb,cc;
    			scanf("%d%d%d",&aa,&bb,&cc);
    			ad(aa,bb,cc),ad(bb,aa,cc);
    		}
    		wt[0]=0x3f3f3f3f;
    		Root=0;
    		Tsiz=n;
    		get_root(1,0);
    		//printf("Root=%d
    ",Root);
    		dfss(Root);
    		printf("%d
    ",ans-n);
    	}
    	return 0;
    }
    
  • 相关阅读:
    第2课 检索数据
    jmeter断言-响应断言
    jmeter参数化
    性能测试重要指标
    Web测试中,各类web控件测试点(转)
    jmeter-分布式集群测试-执行机无响应数据
    jmeter分布式集群测试-Error initialising remote server
    jmeter分布式集群测试-修改执行机默认端口
    jmeter分布式集群测试
    selenium-webdriver层级定位元素
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/13023719.html
Copyright © 2011-2022 走看看