測試5T3 星座

2022-08-20 18:18:08 字數 1556 閱讀 6763

星空中有n顆星星,有n-1對星星間被人為地連上了線,每條連線有各自的長度。所有星星被連成了乙個整體。現在,你要在星系中找到乙個最大的十字形星座。即,你要找到兩條星星構成的路徑,使得它們恰好有一顆公共星(這顆公共星不能是某條路徑的端點),且兩條路徑的長度和最大。

左圖紅線表示了乙個合法的十字形星座,而右圖的星座並不合法。

輸入 第一行乙個數n,表示星星的數量。

接下來n行,每行3個數x,y,z,表示第x顆星星和第y顆星星間有一條連線,它的長度是z。

輸出 一行,包含乙個整數,表示最大的路徑長度和。若答案不存在,輸出-1。

樣例輸入

10 3 8 6

9 3 5

1 9 2

4 8 6

2 3 3

10 4 8

5 9 5

7 2 3

6 9 1

樣例輸出

33 提示

20%的資料n<=1000

50%的資料n<=10,000

100%的資料n<=100,000,0<=z<=1000

這道題講道理暴力應該有50分,但是打炸了~~

這裡我們用乙個f和g陣列,任選乙個樹根,dfs樹上dp,f[i][0][1][2][3]分別表示從i開始,向下走到某個葉子為止最長、第二長、第三長、第四長的路徑長度。從葉子向樹根的順序dp。

#include#include

#include

#define maxn 100005

using

namespace

std;

int head[maxn],next[maxn*2],ans=0,n,dis[maxn],num=0,val[maxn*2],to[maxn*2],s[maxn][5],b[maxn][5

],g[maxn];

void make_way(int u,int v,int

c)int dfs(int u,int

fa)else

if(p>s[u][2

])

else

if(p>s[u][3

])

else

if(p>s[u][4

]) s[u][

4]=p,b[u][4]=p;

}return

dis[u];

}void dp(int u,int

fa)

if(s[u][4

]) ans=max(ans,s[u][4]+s[u][1]+s[u][2]+s[u][3

]);

if(s[u][3

]) ans=max(ans,s[u][1]+s[u][2]+s[u][3]+g[u]);

}int

main()

dfs(

1,0);

dp(1,0);

cout

}

測試4T3 圍欄問題

時間限制 2 sec 記憶體限制 128 mb 在一片草原上,有n只兔子無憂無慮地生活著。這片草原可以劃分成m m的方陣。每個方格內最多有乙隻兔子。一位飼養員負責餵養這些兔子。為了方便,她需要用籬笆建造最多k座圍欄,將草原上的兔子全部圍起來。圍欄需要滿足以下條件 1 必須沿著網格線建造 2 每座圍欄...

濟南學習 Day 5 T3 am

題目描述 眾所不知,rly現在不會玩西洋棋。但是,作為乙個oier,rly當然做過八皇后問題.在這裡再囉嗦幾句,皇后可以攻擊到同行同列同對角線,在 n n的棋盤中,擺放n個皇后使它們互相不能攻擊到,求不同的解的數量,這就是經典的n皇后問題。現在問題推廣n皇后問題,這個問題對你而言實 在是小菜一碟。但...

2018 11 05測試T3 相交

傳送門 一道不錯的題 首先,要知道乙個東西,即若兩條路徑相交,則一條路徑的 lca lcalc a 必然在另一條路徑上 我們每加入一條邊,都計算一下之前的邊加上它對答案的貢獻 現在假設加 a,b a,b a,b 條邊,具體有一下幾種情況 統計 a,b a,b a,b 這條路徑上的 lca lcalc...