国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

POJ1741 Tree.

2019-11-10 23:16:24
字體:
供稿:網(wǎng)友
Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.Write a PRogram that will count how many pairs which are valid for a given tree. InputThe input contains several test cases. The first line of each test case contains two integers n, k. (n<=10000) The following n-1 lines each contains three integers u,v,l, which means there is an edge between node u and v of length l. The last test case is followed by two zeros. OutputFor each test case output the answer on a single line.Sample Input
5 41 2 31 3 11 4 23 5 10 0Sample Output
8(說起來這應(yīng)該是人生第一道點(diǎn)分治唄。。。quq蒟蒻的悲哀:)題意:給定一棵N(1<= N <=10000)個結(jié)點(diǎn)的帶權(quán)樹,定義dist(u,v)為u,v兩點(diǎn)間的最短路徑長度,路徑的長度定義為路徑上所有邊的權(quán)和。再給定一個 K  ,如果對于不同的兩個結(jié)點(diǎn)a,b,如果滿足dist(a,b) <=K,則稱(a,b)為合法點(diǎn)對。求合法點(diǎn)對個數(shù)。題解:也是剛剛搞完點(diǎn)分治唄。。。%XZK難得一次編譯過AC。。。所謂點(diǎn)分治嘞,就是在一個無根樹里選取一個點(diǎn)作為根【重心】然后再遞歸處理每個子樹對于這道題嘛,我們考慮一條路徑只有兩種情況——經(jīng)過根or不過根【也可以說是:兩點(diǎn)在同一棵子樹內(nèi)or不在同一顆子樹內(nèi)】那么我們就可以得出一個大致框架:記錄每個子樹內(nèi)的到子樹【我們遞歸處理的樹】根節(jié)點(diǎn)距離值,然后從小到大排一個序,就可以計算出符合dist(a,b)<=k的點(diǎn)對個數(shù),用這種方法對每一個子樹計一個res表示合法點(diǎn)對數(shù)這個時候要注意:對于一棵這樣的樹 ,由于遞歸的緣故,會有重復(fù)計算的情況所以我們的結(jié)果ans=ans-sigama res的【即:所有滿足合法的點(diǎn)對-在同一個子樹的點(diǎn)對數(shù)】以下是AC代碼:=v=
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define inf 0x7fffffff#define maxn 10010using namespace std;struct node{	int v,w,nxt;}e[maxn*4];int n,k;int vis[maxn];int dis[maxn],dep[maxn];int size[maxn],f[maxn];int head[maxn],cnt;int rt,cd;void add(int u,int v,int w){	e[++cnt].v=v;	e[cnt].w=w;	e[cnt].nxt=head[u];	head[u]=cnt;}void getroot(int x,int fa,int sum){	size[x]=1;f[x]=0;	for(int i=head[x];i!=-1;i=e[i].nxt){		int v=e[i].v;		if(!vis[v] && v!=fa){			getroot(v,x,sum);			size[x]+=size[v];			f[x]=max(f[x],size[v]);		}	}	f[x]=max(f[x],sum-size[x]);	if(f[x]<f[rt])rt=x;	}void getdeep(int x,int fa){	dis[++cd]=dep[x];	for(int i=head[x];i!=-1;i=e[i].nxt){		int v=e[i].v;		if(!vis[v] && v!=fa){			dep[v]=dep[x]+e[i].w;			getdeep(v,x);		}	}}int work(int x,int val){	dep[x]=val;cd=0;	getdeep(x,0);	sort(dis+1,dis+cd+1);	int res=0,l=1,r=cd;	while(l<r){		if(dis[l]+dis[r]<=k)res+=r-l,l++;		else r--;	}	return res;}int ans;void solve(int x){	ans+=work(x,0);	vis[x]=1;	for(int i=head[x];i!=-1;i=e[i].nxt){		int v=e[i].v;		if(!vis[v]){			ans-=work(v,e[i].w);			rt=0;			getroot(v,rt,size[v]);			solve(rt);		}	}}int main(){	while(~scanf("%d%d",&n,&k)){		if(n==0 && k==0)break;		ans=0,rt=0;		memset(head,-1,sizeof head);memset(vis,0,sizeof vis);		cnt=0;		memset(size,0,sizeof size);		for(int i=1;i<n;i++){			int u,v,w;scanf("%d%d%d",&u,&v,&w);			add(u,v,w);add(v,u,w);		}		f[0]=inf;		getroot(1,0,n);		solve(rt);		printf("%d/n",ans);	}	return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 牟定县| 仲巴县| 兴安盟| 绵阳市| 汝阳县| 瓮安县| 九寨沟县| 镇赉县| 兰州市| 钟祥市| 隆回县| 临夏县| 黄石市| 正定县| 文水县| 岢岚县| 五大连池市| 厦门市| 昌平区| 玛纳斯县| 石林| 汉川市| 措美县| 大竹县| 双辽市| 惠来县| 财经| 商水县| 台南市| 大渡口区| 广丰县| 调兵山市| 英山县| 三明市| 大英县| 克山县| 剑川县| 剑川县| 水富县| 通江县| 益阳市|