D 从1开始走 走过所有的点
最少的花费 显然 走到叶子节点 最大的费用 不用算
那么就是从根开始走走到叶子的距离处理出来 dis[i] 从根到i 的距离
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAXN 100010 #define LL __int64 int head[MAXN]; struct edg { LL from,to,next,w; }edge[MAXN*2]; LL cnt,ans,mx; void add(int u,int v,LL w) { edge[cnt].from=u; edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } LL dis[MAXN]; void dfs(int u,int fa) { for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(v==fa) continue; ans = ans +edge[i].w*2; dis[v]=dis[v]+dis[u]+edge[i].w; dfs(v,u); } } int main() { int n; while(scanf("%d",&n)!=EOF) { memset(head,-1,sizeof(head)); memset(dis,0,sizeof(dis)); cnt=0; for(int i=1;i<n;i++) { int u,v; LL w; scanf("%d%d%I64d",&u,&v,&w); add(u,v,w); add(v,u,w); } ans=0; for(int i=head[1];i!=-1;i=edge[i].next) { int v=edge[i].to; ans += edge[i].w*2; dis[v]=dis[v]+edge[i].w; dfs(v,1); } mx=0; for(int i=1;i<=n;i++) mx=max(mx,dis[i]); printf("%I64d ",ans-mx); } return 0; }
A
简单说就是求最大的树的深度
#include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<vector> using namespace std; #define MAXN 2010 #define inf 1000000000.0 vector<int>z[MAXN]; bool vis[MAXN]; int ans; void dfs(int u,int fa,int num) { vis[u]=1; int sz=z[u].size(); ans =max(ans,num); for(int i=0;i<sz;i++) { if(z[u][i]==fa) continue; dfs(z[u][i],u,num+1); } } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { int a; scanf("%d",&a); if(a==-1) continue; z[a].push_back(i); } ans =0; for(int i=1;i<=n;i++) { if(!vis[i]) dfs(i,0,1); } printf("%d ",ans); } return 0; }