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;
    }


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

  • 相关阅读:
    阿里云centos7.2自己安装mysql5.7远程不能访问解决方案
    Delphi中的线程类
    简单说说Delphi中线程的释放
    delphi杀进程的两种方式
    delphi备份恢复剪切板(使用了GlobalLock API函数和CopyMemory)
    Delphi 7下使用Log4Delphi 0.8日志组件
    Demo+在Linux下运行(CentOS7+dotnetcore sdk)
    反射
    解析表达式树
    JS面向对象编程之:封装、继承、多态
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4910312.html
Copyright © 2011-2022 走看看