zoukankan      html  css  js  c++  java
  • BZOJ 2435 NOI2011 道路建设 BFS/DFS

    标题效果:给定一个树(直接将树。不要贪图生成树图!)。寻找每条边权值*分差的两侧之间

    BFS水必须是能

    竟DFS能够住。。。系统堆栈可能有些不够,我们可以使用内联汇编手册中大型系统堆栈 详见代码

    这个问题读取优化可以优化掉4s右

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define stack_size (20001000)
    #define M 1001001
    using namespace std;
    typedef long long ll;
    struct abcd{
        int to,f,next;
    }table[M<<1];
    int head[M],tot;
    int n,fa[M],f[M],siz[M],q[M],r,h;
    ll ans;
    int stack[stack_size],bak;
    void DFS(int x)
    {
        int i;
        siz[x]=1;
        for(i=head[x];i;i=table[i].next)
        {
            if(table[i].to==fa[x])
                continue;
            fa[table[i].to]=x;
            f[table[i].to]=table[i].f;
            DFS(table[i].to);
            siz[x]+=siz[table[i].to];
        }
        ans+=(ll)abs(siz[x]+siz[x]-n)*f[x];
    }
    void CallDFS()  
    {  
        __asm__ __volatile__  
        (  
            "mov %%esp,%0
    " 
            "mov %1,%%esp
    " 
            :"=g"(bak)  
            :"g"(stack+stack_size-1)  
            :  
        );  
        DFS(1);  
        __asm__ __volatile__  
        (  
            "mov %0,%%esp
    " 
            :  
            :"g"(bak)  
            :  
        );  
    }  
    inline int getc() {
        static const int L = 1 << 15;
        static char buf[L], *S = buf, *T = buf;
        if (S == T) {
            T = (S = buf) + fread(buf, 1, L, stdin);
            if (S == T)
                return EOF;
        }
        return *S++;
    }
    inline int getint() {
        int c;
        while(!isdigit(c = getc()) && c != '-');
        bool sign = c == '-';
        int tmp = sign ? 0 : c - '0';
        while(isdigit(c = getc()))
            tmp = (tmp << 1) + (tmp << 3) + c - '0';
        return sign ? -tmp : tmp;
    }
    void Add(int x,int y,int z)
    {
        table[++tot].to=y;
        table[tot].f=z;
        table[tot].next=head[x];
        head[x]=tot;
    }
    int main()
    {
        int i,x,y,z;
        cin>>n;
        for(i=1;i<n;i++)
        {
            x=getint();
            y=getint();
            z=getint();
            Add(x,y,z);
            Add(y,x,z);
        }
        CallDFS();
        cout<<ans<<endl;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Python 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4910312.html
Copyright © 2011-2022 走看看