令乙個點的屬性值為:去除這個點以及與這個點相連的所有邊後得到的連通分量的節點數的最大值。
則樹的重心定義為:乙個點,這個點的屬性值在所有點中是最小的。
sgu 134 即要找出所有的重心,並且找出重心的屬性值。
考慮用樹形dp。
dp[u]表示割去u點,得到的連通分支的節點數的最大值。
tot[u]記錄以u為根的這棵子樹的節點數總和(包括根)。
則用一次dfs即可預處理出這兩個陣列。再列舉每個點,每個點的屬性值其實為max(dp[u],n-tot[u]),因為有可能最大的連通分支在u的父親及以上。然後記錄答案就可以了。
**:
#include #includeview code#include
#include
#include
#include
#include
using
namespace
std;
vector
g[16005
];int dp[16005],tot[16005
];vector
ans;
void dfs(intu)}
intmain()
memset(dp,
0,sizeof
(dp));
memset(tot,-1,sizeof
(tot));
dfs(1);
int mini =mod;
for(i=1;i<=n;i++)
else
if(tmp ==mini)
ans.push_back(i);
}printf(
"%d %d\n
",mini,ans.size());
sort(ans.begin(),ans.end());
printf("%d
",ans[0
]);
for(i=1;i)
printf("%d
",ans[i]);
puts(
"");
return0;
}
樹形DP求樹的重心 SGU 134
令乙個點的屬性值為 去除這個點以及與這個點相連的所有邊後得到的連通分量的節點數的最大值。則樹的重心定義為 乙個點,這個點的屬性值在所有點中是最小的。sgu 134 即要找出所有的重心,並且找出重心的屬性值。考慮用樹形dp。dp u 表示割去u點,得到的連通分支的節點數的最大值。tot u 記錄以u為...
SGU 134 Centroid 樹的重心
題意 給出一棵樹求樹的重心,輸出兩行,第一行為重心的子樹的最大節點數,重心的個數,第二行按照公升序給出重心的編號 include include include using namespace std define max a,b a b a b define min a,b a b a b con...
樹形dp 樹的重心
1.只需要求出最大子樹中節點數最小的數目即可 題意 有乙個國王要把他的領土分給兩個兒子,國王的領土是一棵樹,n個結點,n 1條邊把這些結點連起來,現在大小兒子要選擇乙個點作為他的首都,那麼除首都分別是這兩個兒子之外,其他的城市 結點 根據離誰近就歸誰所有,如果一樣遠的話就歸大兒子所有,現在假設兩個人...