zoukankan      html  css  js  c++  java
  • 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
    ",calc(dis));
    42     return 0;
    43 } 
  • 相关阅读:
    解方程
    十进制快速幂
    comb
    题单解题记录-POJ题目分类推荐 (很好很有层次感)
    算法题离谱错误合集
    VMware-Ubuntu16.04踩坑解决记录
    2020牛客多校赛第三场
    需学习的博客地址
    错误记录
    可持久化线段树 区间第k大/小
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12409252.html
Copyright © 2011-2022 走看看