#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=2*N;
int st[M];
int n;
int h[M],idx,e[M],ne[M];
int ans=0x3f3f3f;
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int dfs(int u){
st[u]=true;
int res=0;
int sum=1;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(!st[j]){
int k=dfs(j);
res=max(res,k);
sum+=k;
}
}
res=max(res,n-sum);
ans=min(ans,res);
return sum;
}
int main(){
memset(h,-1,sizeof h);
cin >> n;
for(int i=0;i<n-1;i++){
int a,b;
cin >> a >> b;
add(a,b),add(b,a);
}
int wu=dfs(1);
cout << ans;
return 0;
}
参考题解
#include<bits/stdc++.h>
using namespace std;
const int N=2*(1e4+10);
int head[N],e[N],ne[N],idx,w[N];
int n,ans;
void add(int a,int b,int c){
w[idx]=c,e[idx]=b,ne[idx]=head[a],head[a]=idx++;
}
int dfs(int u,int father){
int d1=0,d2=0;
for(int i=head[u];i!=-1;i=ne[i]){
int j=e[i];
if(j==father) continue;
int k=dfs(j,u)+w[i];
if(k>=d1){
d2=d1;
d1=k;
}
else if(k>d2){
d2=k;
}
}
ans=max(ans,d1+d2);
return d1;
}
int main(){
cin >> n;
memset(head, -1, sizeof head);
for(int i=1;i<=n-1;i++){
int a,b,c;
cin >> a >> b >> c;
add(a,b,c);
add(b,a,c);
}
dfs(1,-1);
cout << ans;
return 0;
}
参考题解
每个节点可分为两部分找离它最远的节点,一种是向下找 这和上题树的重心一样,一种是
向上找李它最远的节点,向上找的话就是
up[u]=w[u至父节点]+max(d1[父],d2[父],up[父]),显然d1[父]>d2[父],但当d1[父]经过u时我们只能选择d2[父]
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n;
int h[N],w[N*2],e[N*2],ne[N*2],idx;
int dn1[N],dn2[N],up[N],son1[N],son2[N];
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dfs_down(int u,int father){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father) continue;
dfs_down(j,u);
if(w[i]+dn1[j]>=dn1[u]){
dn2[u]=dn1[u];
dn1[u]=w[i]+dn1[j];
son2[u]=son1[u];
son1[u]=j;
}
else if(w[i]+dn1[j]>dn2[u]){
dn2[u]=w[i]+dn1[j];
son2[u]=j;
}
}
return;
}
void dfs_up(int u,int father){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father) continue;
if(j==son1[u]){
up[j]=max(up[u]+w[i],dn2[u]+w[i]);
}
else {
up[j]=max(up[u]+w[i],dn1[u]+w[i]);
}
dfs_up(j,u);
}
return;
}
int main(){
memset(h, -1, sizeof h);
cin >> n;
for(int i=0;i<n-1;i++){
int a,b,c;
cin >> a >> b >> c;
add(a,b,c),add(b,a,c);
}
dfs_down(1,-1);
dfs_up(1,-1);
int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++){
ans=min(ans,max(up[i],dn1[i]));
}
cout << ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int ne[N*2],e[N*2],h[N],idx;
int n;
int sum[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int d1[N],d2[N];
int res;
int dfs(int u,int father){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father) continue;
int k=dfs(j,u)+1;
if(k>=d1[u]){
d2[u]=d1[u];
d1[u]=k;
}
else if(k>d2[u]){
d2[u]=k;
}
}
res=max(res,d1[u]+d2[u]);
return d1[u];
}
int main(){
cin >> n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
for(int j=2;j*i<=n;j++){
sum[i*j]+=i;
}
}
for(int i=1;i<=n;i++){
if(sum[i]<i){
add(sum[i],i),add(i,sum[i]);
}
}
dfs(1,-1);
cout << res;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=6010;
int h[N],e[N*2],ne[N*2],w[N],idx;
int n;
bool st[N];
int f[N][2];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
dfs(j);
f[u][1]+=f[j][0];
f[u][0]+=max(f[j][0],f[j][1]);
}
}
int main(){
cin >> n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
cin >> w[i];
f[i][1]=w[i];
}
for(int i=1;i<=n-1;i++){
int a,b;
cin >> a >> b;
add(b,a);
st[a]=true;
}
int tmp=0;
for(int i=1;i<=n;i++){
if(!st[i]){
dfs(i);
tmp=i;
}
}
cout << max(f[tmp][1],f[tmp][0]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=N*2;
int h[N],e[M],ne[M],idx;
int n,m;
int w[N],v[N],root;
int f[110][110];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u){
for(int i=h[u];~i;i=ne[i]){
int a=e[i];
dfs(a);
for(int j=m;j>=v[u];j--){
for(int k=0;k<=j-v[u];k++){
f[u][j]=max(f[u][j],f[u][j-k]+f[a][k]);
}
}
}
for(int i=v[u];i<=m;i++){
f[u][i]+=w[u];
}
}
int main(){
cin >> n >> m;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
int father;
cin >> v[i] >> w[i] >> father;
if(father==-1){
root=i;
continue;
}
add(father,i);
}
dfs(root);
cout << f[root][m];
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=N*2;
int f[N][N];
int n,m;
int h[N],e[M],ne[M],idx;
int w[M];
int root;
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dfs(int u,int father){
for(int i=h[u];~i;i=ne[i]){
int a=e[i];
if(a==father) continue;
dfs(a,u);
for(int j=m;j>=1;j--){
for(int k=0;k<=j-1;k++){
f[u][j]=max(f[u][j],f[u][j-k-1]+f[a][k]+w[i]);
}
}
}
}
int main(){
memset(h,-1,sizeof h);
cin >> n >> m;
for(int i=1;i<=n-1;i++){
int a,b,c;
cin >> a >> b >> c;
add(a,b,c),add(b,a,c);
}
dfs(1,-1);
cout << f[1][m];
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int h[N],e[N*2],ne[N*2],idx,w[N];
int n;
long long int f[N];
int root;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int father){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father) continue;
dfs(j,u);
f[u]+=max(f[j],(long long)0);
}
}
int main(){
cin >> n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
cin >> w[i];
f[i]=w[i];
}
for(int i=1;i<=n-1;i++){
int a,b;
cin >> a >> b;
add(a,b);
add(b,a);
}
long long int res=-0x3f3f3f3f;
dfs(3,-1);
for(int i=1;i<=n;i++){
res=max(f[i],res);
}
cout << res;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1510;
int n;
bool st[N];
int e[N],ne[N],w[N],idx,h[N];
int f[N][3];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u){
f[u][2]=w[u];
int sum=0;
for(int i=h[u]; ~i ; i=ne[i]){
int j=e[i];
dfs(j);
f[u][0]+=min(f[j][2],f[j][1]);
f[u][2]+=min(f[j][0],min(f[j][1],f[j][2]));
sum+=min(f[j][1],f[j][2]);
}
f[u][1] = 1e9;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
f[u][1]=min(f[u][1],sum-min(f[j][1],f[j][2])+f[j][2]);
}
}
int main(){
cin >> n;
memset(h,-1,sizeof h);
for (int i = 1; i <= n; i ++ )
{
int id, cost, cnt;
cin >> id >> cost >> cnt;
w[id] = cost;
while (cnt -- )
{
int ver;
cin >> ver;
add(id, ver);
st[ver] = true;
}
}
int root=1;
while(st[root]) root++;
dfs(root);
cout << min(f[root][2],f[root][1]) << endl;
return 0;
}
参考题解
#include<bits/stdc++.h>
using namespace std;
const int N=1510;
int h[N],e[N],ne[N],idx;
bool st[N];
int f[N][2];
int n;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u){
f[u][1]=1,f[u][0]=0;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
dfs(j);
f[u][0]+=f[j][1];
f[u][1]+=min(f[j][1],f[j][0]);
}
}
int main(){
while(cin >> n ){
idx=0;
int ver,cnt;
memset(h,-1,sizeof h);
memset(st,0,sizeof st);
for(int i=0;i<n;i++){
scanf("%d:(%d)",&ver,&cnt);
while(cnt--){
int b;
cin >> b;
add(ver,b);
st[b]=true;
}
}
int root=0;
while(st[root]) root++;
dfs(root);
cout << min(f[root][0],f[root][1])<<endl;
}
return 0;
}