7次
【描述】
你的任務是,對給定樹枝,求出它包含的最長木棍。
【輸入格式】
第一行乙個正整數n,表示頂點數,頂點從1至n編號。
然後n – 1行每行兩個正整數u, v表示u, v之間有一條邊,每條邊的長度為1。
保證輸入的是一棵樹。
【輸出格式】
只有一行,表示給定樹的最長鏈長度。
【樣例輸入】
1 21 3
1 41 5
【樣例輸出】
【分析】
很明顯,求樹中的最長鏈。設f[i]是i的子樹中最遠的點到自己的距離,p[i]是第二遠的點到自己的距離。那麼所有的點鐘最大的f[i]+p[i]就是答案。
第一次寫——臨邊表。顯然存不下。
第二次寫——模擬鍊錶。用的遞迴造樹,爆掉。
想到了要用手工的棧。
可是我不知道怎麼寫囧。
於是看了標程。
原來還可以這麼構樹!!!
原來手工棧這麼寫!!!
頓悟。第三次——ac。
01#include
02#include
03#define maxn 1000010
0405
int f[maxn];
06int father[maxn],str[maxn];
07struct ss
08 a[maxn];
11int tot,n,u,v,p,ans;
12int c[maxn],deep[maxn],sta[maxn],top,e[maxn],te;
1314
void ins(int x,int y)
1520
21int cmp(const
void*a,const
void*b)
2228
29int main()
3041
42sta[0]=1;
43e[0]=str[1];
44father[1]=0;
45while (top>=0)
4661}62
}6364for (int i=1;i<=n;++i) c[i]=i;
65deep[0]=-1;
66qsort(c,n+1,sizeof(int),cmp);
67for (int i=n;i>0;--i)
6882
else
83if (f[v]+1>p) p=f[v]+1;
84te=a[te].next;85}
86while (te);
87if (f[u]+p>ans) ans=f[u]+p;88}
8990
printf("
%d\n
",ans);
9192
return
0;93
}
高精度乘法哦吼吼
廢話不多說,直接上 include include include include include include include include using namespace std intmain b 2001 c 200001 lena,lenb,lenc,i,j,x scanf s a1 ...
Evensgn 剪樹枝 樹規
f x 0 表示與其父邊相連的連通塊內沒有黑蘋果的方案數,f x 1 則表示有黑蘋果,如果父邊被切斷,相當於沒有黑蘋果 初始化時,假設切掉父邊,f x 0 1,f x 1 0 遞迴回時轉移,每遞迴回乙個子樹,f x 1 f x 1 f v 0 f x 0 f v 1 f x 0 f x 0 f v ...
繁華模擬賽 Evensgn 剪樹枝
繁華中學有一棵蘋果樹。蘋果樹有 n 個節點 也就是蘋果 n 1 條邊 也就 是樹枝 調皮的 evensgn 爬到蘋果樹上。他發現這棵蘋果樹上的蘋果有兩種 一 種是黑蘋果,一種是紅蘋果。evensgn 想要剪掉 k 條樹枝,將整棵樹分成 k 1 個 部分。他想要保證每個部分裡面有且僅有乙個黑蘋果。請問...