C++-蓝桥杯-大臣的旅费[dfs][树的直径]
最坑的一点是没有数据范围,但是就蓝桥杯的德性,int就够了然后数组尽可能开大一点
O(n)算法要自信,嗯嗯嗯!
一次AC,没什么好说的,上代码:
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int N=1e6+10,M=2e6+10,INF=1e9; 5 struct edge{ 6 int v,w,next; 7 edge(int v=0,int w=0,int next=0):v(v),w(w),next(next){} 8 }; 9 edge E[M]; 10 int head[N],cnt,n,dis[N]; 11 void dfs(int u,int fa){ 12 for(int i=head[u];i;i=E[i].next) 13 if(E[i].v!=fa){ 14 dis[E[i].v]=min(dis[E[i].v],dis[u]+E[i].w); 15 dfs(E[i].v,u); 16 } 17 } 18 int search(int root,int type){ 19 for(int i=1;i<=n;i++)dis[i]=INF; 20 dis[root]=0; 21 dfs(root,root); 22 int ans=0,res; 23 for(int i=1;i<=n;i++)if(dis[i]>ans)ans=dis[i],res=i; 24 return type?res:ans; 25 } 26 int calc(int dis){ 27 int ans=dis*10,a=dis; 28 if(a%2)a=(a+1)/2,ans+=a*dis; 29 else a=a/2,ans+=a*(1+dis); 30 return ans; 31 } 32 int main(){ 33 int u,v,w; 34 scanf("%d",&n); 35 for(int i=1;i<n;i++){ 36 scanf("%d%d%d",&u,&v,&w); 37 E[++cnt]=edge(v,w,head[u]),head[u]=cnt; 38 E[++cnt]=edge(u,w,head[v]),head[v]=cnt; 39 } 40 int rt=search(1,1),dis=search(rt,0); 41 printf("%d\n",calc(dis)); 42 return 0; 43 }
~~Jason_liu O(∩_∩)O