星空中有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...