吼吼 加工樹枝

2021-09-08 00:09:25 字數 1439 閱讀 1575

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 個 部分。他想要保證每個部分裡面有且僅有乙個黑蘋果。請問...