码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ_2435_[Noi2011]道路修建_dfs

时间:2018-02-25 20:33:19      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:target   namespace   blog   wap   ace   std   void   algorithm   bre   

BZOJ_2435_[Noi2011]道路修建_dfs

题意:

http://www.lydsy.com/JudgeOnline/problem.php?id=2435

 

分析:

dfs搞定。

我怕爆栈写了非递归dfs。

其实bfs两遍也可以做。

 

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000050
#define LL long long
int head[N],to[N<<1],nxt[N<<1],cnt,n,val[N];
int fa[N],siz[N],vis[N];
inline void add(int u,int v){
    to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    char ch=nc();int sum=0;
    while(!(ch>=‘0‘&&ch<=‘9‘))ch=nc();
    while(ch>=‘0‘&&ch<=‘9‘)sum=sum*10+ch-48,ch=nc();
    return sum;
}
int main(){
    n=read();
    int x,y,z;
    register int i;
    for(i=1;i<n;i++){
        x=read(),y=read(),val[i]=read();
        add(x,y);add(y,x);siz[i]=1;
    }
    siz[n]=1;x=1;
    while(x)
    {
        int f=0;
        for(i=head[x];i;i=nxt[i])
        {
            if(to[i]==fa[x])continue;
            f=1;
            fa[to[i]]=x;
            head[x]=nxt[i];
            x=to[i];
            break;
        }
        if(f==0)siz[fa[x]]+=siz[x],x=fa[x];
    }
    LL ans=0;
    for(i=1;i<2*n-2;i+=2){
        x=to[i],y=to[i+1],z=val[i+1>>1];
        if(fa[y]==x)swap(x,y);
        ans+=1ll*z*(n-siz[x]-siz[x]<0?siz[x]+siz[x]-n:n-siz[x]-siz[x]);
    }
    printf("%lld\n",ans);
}

 

BZOJ_2435_[Noi2011]道路修建_dfs

标签:target   namespace   blog   wap   ace   std   void   algorithm   bre   

原文地址:https://www.cnblogs.com/suika/p/8470028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!