• poj 2114 树的分治 可作模板


    /*
    啊啊啊啊啊啊啊本题证明一个问题,在实际应用中sort比qsort块
    还有memset这类初始化能不加尽量别加,很浪费时间
    原来的程序把qsort该成sort,去掉一个无用memset就a了时间不到一半
    题意:和poj1741差不多,不过本题求的是dis[i]+dis[j]==dis[k];
    */
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    #define N  11000
    #define inf 0x3fffffff
    struct node {
    int u,v,w,next;
    }bian[N*4];
    int yong,head[N];
    void init() {
     yong=0;
     memset(head,-1,sizeof(head));
    }
    void addedge(int u,int v,int w) {
    bian[yong].u=u;
    bian[yong].v=v;
    bian[yong].w=w;
    bian[yong].next=head[u];
    head[u]=yong++;
    }
    int minn,ma,vis[N],diss[N],len,num[N],nn;
    void  dfs1(int u,int fa) {
       int i;
       nn++;
       for(i=head[u];i!=-1;i=bian[i].next) {
        int v=bian[i].v;
        if(v!=fa&&!vis[v])
        dfs1(v,u);
       }
       return ;
    }
    int Max(int v,int vv) {
    return v>vv?v:vv;
    }
    void dfs2(int u,int fa) {
      num[u]=1;
      int i,tit=0;
      for(i=head[u];i!=-1;i=bian[i].next) {
        int v=bian[i].v;
        if(v!=fa&&!vis[v]) {
            dfs2(v,u);
            num[u]+=num[v];
            tit=Max(tit,num[v]);
        }
      }
       tit=Max(tit,nn-num[u]);
       if(tit<minn) {
        minn=tit;
        ma=u;
       }
       return ;
    }
    void dfs4(int u,int fa,int w) {
     int i;
     diss[len++]=w;
     for(i=head[u];i!=-1;i=bian[i].next) {
        int v=bian[i].v;
        if(v!=fa&&!vis[v])
            dfs4(v,u,w+bian[i].w);
     }
     return ;
    }
    int m;
    int dfs3(int u,int fa,int w) {
       len=0;
       dfs4(u,fa,w);
     sort(diss,diss+len);
        int i,j,ans=0,k;
        for(i=0,j=len-1;i<j;i++) {//1000ms
            while(i<j&&diss[i]+diss[j]>m)
                j--;
                k=j;
            while(i<k&&diss[i]+diss[k]==m) {
                    k--;
                    ans++;
            }
        }
        /*
         i=0;j=len-1;
        while(i<j) {//688ms
            if(diss[i]+diss[j]<m)
                i++;
            else
                if(diss[i]+diss[j]>m)
                    j--;
            else {
                if(diss[i]==diss[j]) {
                    ans+=(j-i+1)*(j-i)/2;
                    break;
                }
               ki=i;kj=j;
                while(diss[i]==diss[ki])ki++;
                while(diss[j]==diss[kj])kj--;
                ans+=(ki-i)*(j-kj);
                i=ki;j=kj;
            }
        }
        */
        return ans;
    }
    int dfs(int u) {
       minn=inf;
       nn=0;
       dfs1(u,-1);
       dfs2(u,-1);
       int ans=dfs3(ma,-1,0);
     //  printf("%d
    ",ma);
       vis[ma]=1;
       int i;
       for(i=head[ma];i!=-1;i=bian[i].next) {
        int v=bian[i].v;
        if(!vis[v]) {
            ans-=dfs3(v,-1,bian[i].w);
            ans+=dfs(v);
        }
       }
       return ans;
    }
    int main() {
       int  n,i,j,k;
       while(scanf("%d",&n),n) {
            init();
        for(i=1;i<=n;i++) {
        while(scanf("%d",&j),j) {
                scanf("%d",&k);
                addedge(i,j,k);
        addedge(j,i,k);
            }
        }
        while(scanf("%d",&m),m) {
           memset(vis,0,sizeof(vis));
           k=dfs(1);
           if(k)
            printf("AYE
    ");
            else
                printf("NAY
    ");
        }
        printf(".
    ");
       }
    return 0;
    }
    

  • 相关阅读:
    畅通工程(hdu1232)并查集
    qsort函数的用法
    二叉搜索树(hdu3791)
    Binary Tree Traversals(HDU1710)二叉树的简单应用
    Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
    山东省第四届acm解题报告(部分)
    Points on Cycle (hdu1700,几何)
    A计划 hdu2102(bfs一般题)
    杀人游戏(hdu2211)插入法
    hdu1518 Square(dfs)
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410598.html
Copyright © 2020-2023  润新知