题目:

1、数组建立邻接表;
int idx,h[N],e[2*N],ne[2*N];
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx;
idx ++;
}
2、树的dfs模板:
void dfs(int x)
{
st[x] = true;//标记;
//开始遍历;
for(int i = h[x];i!=-1;i = ne[i])
{
int j = e[i];
if(!st[j]) dfs(j);
}
}
此题dfs
void dfs(int x)
{
int res = 0;//存储 删掉某个节点之后,最大的连通子图节点数
st[x] = true;//标记
int sum = 1;//存储以x为根的结点数
//开始遍历;
for(int i = h[x];i!=-1;i = ne[i])
{
int j = e[i];
if(!st[j])
{
int s = dfs(j);
res = max(res,s);//记录连接最大的子结点数;
sum += res;//以j为根的结点数;
}
}
res = max(res, n - sum); // 选择u节点为重心,最大的 连通子图节点数
ans = min(res, ans); //遍历过的假设重心中,最小的最大联通子图的 节点数
return sum;
}
3、主函数
int main() {
memset(h, -1, sizeof h); //初始化h数组 -1表示尾节点
cin >> n; //表示树的结点数
// 题目接下来会输入,n-1行数据,
// 树中是不存在环的,对于有n个节点的树,必定是n-1条边
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
add(a, b), add(b, a); //无向图
}
dfs(1); //可以任意选定一个节点开始 u<=n
cout << ans << endl;
return 0;
}
注意:无向图操作:add(a,b),add(b,a);
1301

被折叠的 条评论
为什么被折叠?



