1.最樸素的求法:
列舉每乙個點作為起點找到離它最遠的那個點(dfs),取每個點的最長路徑的max
時間複雜度: o(n*n)
**這裡不貼咯
2.樹形dp
對於點作為根,它的最長路徑是他的最長路徑和次長路徑的和。所以對數進行樹形dp:dp[x][0]->最長, dp[x][1]->次長。
dp[x][1]+dp[x][0]即為以此點為根的最長路徑。
#include #include #include using namespace std;
const int maxn=100005;
struct node
;vectorv[maxn];
node tmp;int ans=0;
int f[maxn][2];
void find(int x,int fa)
else if(f[p][0]+w>f[x][1]) f[x][1]=f[p][0]+w;
} ans=max(ans,f[x][1]+f[x][0]);
}int main()
for(int i=0;ivoid bfs(int s)
}} }
}
階段1 樹的直徑 改邊權 巡邏
題意 在乙個地區有 n 個村莊,編號為1,2,n。有 n 1 條道路連線著這些村莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其他任乙個村莊。每條道路的長度均為1個單位。為保證該地區的安全,巡警車每天都要到所有的道路上巡邏。警察局設在編號為1的村莊裡,每天巡警車總是從警局出發,...
小a與尤拉迴路(樹的直徑的求法)
題目鏈結 這道題是一點思路都沒有,看了別人的題解後,知道了答案其實是 ans 樹的總權值 2 樹的直徑 首先,易知每個邊最多複製兩遍。思考後,可知,我們先假定每個邊都複製了兩遍,於是得到 樹的總權值 2 顯然,我們算多了。於是我們考慮減去某些邊,這裡我們可以將樹看作乙個帶有支路的一條主幹道 這時我們...
一本通 數字轉換 (樹的直徑 兩種求法)
定義 我們將一棵樹t v,e 的直徑定義為max u,v u,v v 也就是說,樹中所有最短路徑距離的最大值即為樹的直徑。題意 若是乙個數x的所有約數 不包括他自己 之和sum比他自己小,那麼x可以轉化成sum,sum也可以成 x。例如 4可以變為 3,1可以變為7 限制所有數字在不超過n的正整數範...