POJ 1741 Tree

難度 尚未評(píng)定
Description
給定一顆有N個(gè)節(jié)點(diǎn)的樹(shù),每條邊有一個(gè)權(quán)值。樹(shù)上兩個(gè)節(jié)點(diǎn)xy之間的路徑長(zhǎng)度就是路徑上各條邊的權(quán)值的合。
求樹(shù)上長(zhǎng)度不超過(guò)K的路徑有多少條。
CCYOS
這是一道點(diǎn)分治例題挤庇。

  1. 若指定p節(jié)點(diǎn)為根,則對(duì)于節(jié)點(diǎn)p荞膘,樹(shù)上路徑有兩類:
    a. 經(jīng)過(guò)根結(jié)點(diǎn)p罚随。
    b. 包含于p的某一子樹(shù),不經(jīng)過(guò)p羽资。
  2. 對(duì)于第二類路徑淘菩,可以視作每顆子樹(shù)下的子問(wèn)題遞歸處理。
    對(duì)于第一類路徑(x,y)屠升,至多由兩段組成:(x,p)(p,y)潮改。求解第一類路徑時(shí),要記錄d數(shù)組和rt數(shù)組腹暖,分別表示根結(jié)點(diǎn)到該點(diǎn)的距離和該點(diǎn)屬于哪一棵子樹(shù)汇在。根據(jù)題意,\begin{cases} { rt[x] \not= rt[y]}\\ \ d[x] + d[y] \leq K \end{cases}
  3. 構(gòu)建clac(p)函數(shù)脏答,統(tǒng)計(jì)在以p為根的樹(shù)中滿足上述要求的點(diǎn)對(duì)個(gè)數(shù)糕殉。
  4. 實(shí)現(xiàn)方法:
    一 · 樹(shù)上直接統(tǒng)計(jì)
    對(duì)于根結(jié)點(diǎn)p下的子樹(shù)為s_1,s_2,s_3……,s_m
    對(duì)于s_i中的每個(gè)節(jié)點(diǎn)x殖告,將在子樹(shù)s_1,s_2,……,s_i - 1中滿足d[x] + d[y] \leq k的節(jié)點(diǎn)y數(shù)量加入答案中即可阿蝶。
    可建立樹(shù)狀數(shù)組求解。
    本做法應(yīng)用:YALI 0J 2902B 文學(xué)
    二·指針掃描數(shù)組
    把樹(shù)上每個(gè)點(diǎn)放入數(shù)組a黄绩,并將數(shù)組按照d值排序羡洁。
    使用兩個(gè)指針L,R從前后掃描數(shù)組a
    不難發(fā)現(xiàn)在L向右掃描的過(guò)程中爽丹,R的范圍是從右往左單調(diào)遞減的筑煮。(不能加大數(shù)了)
    另外處理一個(gè)數(shù)組cnt[s],維護(hù)在(L,R]之間滿足rt[a[i]] = s的位置i的個(gè)數(shù)粤蝎。
    則易得當(dāng)x == a[L]時(shí)真仲,答案即為R - L - cnt[rt[a[L]]]
    本做法應(yīng)用:POJ 1741 Tree
  5. 總結(jié)點(diǎn)分治算法過(guò)程:
    a.找到樹(shù)的中心p作為根結(jié)點(diǎn)初澎。
    b.從p進(jìn)行dfs秸应,求出rtd數(shù)組。
    c.clac(p)統(tǒng)計(jì)答案。
    d.刪除根結(jié)點(diǎn)p灸眼,對(duì)p的每顆子樹(shù)進(jìn)行a - d。

code

#include<cstdio> 
#include<iostream>
#include<cmath>  
#include<algorithm>  
using  namespace std;  
struct EDGE{  int to,next;  long  long w;  }edg[80005];  
int n,tot,root,limit,siz,vis[40005],head[40005],size[40005];  
long  long k,ans,l,r;  
long que[40005],dis[40004];  
inline  void adde(int x,int y,int w){ edg[++tot].to = y; edg[tot].w = w; edg[tot].next  = head[x]; head[x]  = tot;  } 
inline  void getroot(int p,int fa){
  size[p]  =  1;  int num =  0;//從p點(diǎn)出發(fā)的子樹(shù)大小 
  for(int i = head[p];i;i = edg[i].next){
    int to = edg[i].to;  
    if(fa == to||vis[to])continue; 
    getroot(to,p); size[p]  += size[to]; 
    num = max(num,size[to]);  
  } 
  num = max(num,siz - size[p]);  
  if(num < limit){//limit:當(dāng)前最小 
    limit = num; root = p;  
  }  
}  
inline  void getdis(int p,int fa){ 
  que[++r]  = dis[p];    
  for(int i = head[p];i;i = edg[i].next){
    int to = edg[i].to;
    if(to == fa||vis[to])continue;
    dis[to]  = dis[p]  + edg[i].w; getdis(to,p);  
  }  
}  
inline  long  long clac(int p,int v){
  r =  0; dis[p]  = v;  
  long  long sum =  0; 
  getdis(p,0); 
  l =  1; 
  sort(que +  1,que + r +  1);  
  while(l < r){
    if(que[l]  + que[r]  <= k)sum += r - l,++l;  
    else r--;  
  }  
  return sum;  
}  
inline  void dfs(int p){
  ans += clac(p,0); vis[p]  =  1;//將p點(diǎn)作為根結(jié)點(diǎn)是否處理完畢
  for(int i = head[p];i;i = edg[i].next){
    int to = edg[i].to;
    if(vis[to])continue;
    ans -= clac(to,edg[i].w);
    siz = size[to];
    limit =  2147483647;
    getroot(to,0);
    dfs(root);  
  }  
}  
inline  void init(){ 
  tot =  0;ans =  0;  
  for(int i =  1;i <= n;++i)head[i]  =  0,vis[i]  =  0;  
}  
int main(){ 
  scanf("%d%lld",&n,&k);  
  int x,y;  long  long w;  
  while(n&&k){  for(int i =  1;i < n;++i){   
    scanf("%d%d%lld",&x,&y,&w); 
    adde(x,y,w); adde(y,x,w);  
  } 
  limit =  2147483647;// 
  siz = n;//對(duì)于第一棵子樹(shù)的大小限制     
  getroot(1,0);//找到樹(shù)的重心墓懂,更新root 
  dfs(root);//從root開(kāi)始遞歸統(tǒng)計(jì)更新答案 
  printf("%lld\n",ans); init(); 
  scanf("%d%lld",&n,&k);  
  }  
return  0;  
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焰宣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捕仔,更是在濱河造成了極大的恐慌匕积,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榜跌,死亡現(xiàn)場(chǎng)離奇詭異闪唆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钓葫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門悄蕾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人础浮,你說(shuō)我怎么就攤上這事帆调。” “怎么了豆同?”我有些...
    開(kāi)封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵番刊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我影锈,道長(zhǎng)芹务,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任鸭廷,我火速辦了婚禮枣抱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靴姿。我一直安慰自己沃但,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布佛吓。 她就那樣靜靜地躺著宵晚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪维雇。 梳的紋絲不亂的頭發(fā)上淤刃,一...
    開(kāi)封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吱型,去河邊找鬼逸贾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铝侵。 我是一名探鬼主播灼伤,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咪鲜!你這毒婦竟也來(lái)了狐赡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疟丙,失蹤者是張志新(化名)和其女友劉穎颖侄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體享郊,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡览祖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炊琉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展蒂。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苔咪,靈堂內(nèi)的尸體忽然破棺而出玄货,到底是詐尸還是另有隱情,我是刑警寧澤悼泌,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布松捉,位于F島的核電站,受9級(jí)特大地震影響馆里,放射性物質(zhì)發(fā)生泄漏隘世。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一鸠踪、第九天 我趴在偏房一處隱蔽的房頂上張望丙者。 院中可真熱鬧,春花似錦营密、人聲如沸械媒。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纷捞。三九已至,卻和暖如春被去,著一層夾襖步出監(jiān)牢的瞬間主儡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工惨缆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糜值,地道東北人丰捷。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像寂汇,于是被迫代替她去往敵國(guó)和親病往。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系骄瓣,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算荣恐,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,807評(píng)論 0 13
  • Description Give a tree with n vertices,each edge has a l...
    lily_blog閱讀 530評(píng)論 0 0
  • B樹(shù)的定義 一棵m階的B樹(shù)滿足下列條件: 樹(shù)中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外累贤,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,222評(píng)論 0 25
  • Openjudge原題鏈接 POJ原題鏈接 題意輸入樹(shù)的各邊及其長(zhǎng)度,求路徑小于等于k的點(diǎn)對(duì)數(shù)目 題解目標(biāo):尋找長(zhǎng)...
    失樹(shù)閱讀 961評(píng)論 0 0
  • 閱讀《財(cái)富自由之路》第一天 "篤信"少漆,而非相信臼膏。 要"篤信"自己能變得更好。這個(gè)話題說(shuō)起來(lái)容易示损,要做起來(lái)很難渗磅。因?yàn)?..
    秋秋小Q閱讀 575評(píng)論 0 1