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 } 

猜你喜欢

转载自www.cnblogs.com/JasonCow/p/12409252.html
今日推荐