设为首页 加入收藏

TOP

HDU 4705 Y
2014-11-23 21:27:53 来源: 作者: 【 】 浏览:2
Tags:HDU 4705

Y
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 433 Accepted Submission(s): 147


Problem Description


Sample Input
4
1 2
1 3
1 4


Sample Output
1
Hint
1. The only set is {2,3,4}.

2. Please use #pragma comment(linker, "/STACK:16777216")


Source
2013 Multi-University Training Contest 10


Recommend
zhuyuanchen520

比赛最后的时候才有的思路,当时有些细节没有想清楚,也没有急着写,赛后写了一下,结果各种错误,除了addeage()函数我没有改过外,其他的几乎都改过,害我查错查到现在。
有些dp的味道

#include    
#include    
#include    
#include    
#include    
#define N 100010   
#pragma comment(linker, "/STACK:16777216")   
__int64 two[N];  
__int64 sum[N];  
bool status[N];  
int level[N];  
struct num  
{  
    int e,next;  
}a[2*N];  
int b[N],Top;  
int main()  
{  
    //freopen("data.in","r",stdin);   
    void addeage(int x,int y);  
    __int64 pre_deal(int k);  
    __int64 deal(int k);  
    __int64 get_two(int k);  
    int n;  
    while(scanf("%d",&n)!=EOF)  
    {  
        Top=0;  
        memset(b,-1,sizeof(b));  
        for(int i=1;i<=n-1;i++)  
        {  
            int x,y;  
            scanf("%d %d",&x,&y);  
            addeage(x,y);  
            addeage(y,x);  
        }  
        memset(sum,0,sizeof(sum));  
        memset(status,false,sizeof(status));  
        memset(level,0,sizeof(level));  
        pre_deal(1);  
        memset(two,0,sizeof(two));  
        get_two(1);  
        memset(status,false,sizeof(status));  
        __int64 res=deal(1);  
        printf("%I64d\n",res);  
    }  
    return 0;  
}  
void addeage(int x,int y)  
{  
    a[Top].e = y;  
    a[Top].next = b[x];  
    b[x]=Top++;  
}  
__int64 pre_deal(int k)  
{  
    status[k]=true;  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        int x = a[i].e;  
        if(!status[x])  
        {  
            level[x]=level[k]+1;  
            sum[k]+=pre_deal(x);  
        }  
    }  
    sum[k]+=1;  
    return sum[k];  
}  
__int64 get_two(int k)  
{  
    __int64 s1;  
    bool check=true;  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        int y = a[i].e;  
        if(level[y]!=level[k]+1)  
        {  
            continue;  
        }  
        if(check)  
        {  
            s1=sum[y];  
            check=false;  
            continue;  
        }  
        two[k]+=(s1*sum[y]);  
        s1+=sum[y];  
    }  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        int y = a[i].e;  
        if(level[y]!=level[k]+1)  
        {  
            continue;  
        }  
        two[k]+=get_two(y);  
    }  
    return two[k];  
}  
__int64 deal(int k)  
{  
    status[k]=true;  
    __int64 s = 0;  
    __int64 x2,three=0,s1,temp=0;  
    int uv=0;  
    bool check=true;  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        int y = a[i].e;  
        if(level[y]!=level[k]+1)  
        {  
            continue;  
        }  
        if(uv==0)  
        {  
            s1=sum[y];  
            uv++;  
            continue;  
        }  
        if(check)  
        {  
            temp+=(s1*sum[y]);  
            s1+=sum[y];  
            check=false;  
            continue;  
        }  
        three+=(temp*sum[y]);  
        temp+=(s1*sum[y]);  
        s1+=sum[y];  
    }  
    s+=three;  
    __int64 w=0;  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        if(!status[a[i].e])  
        {  
            s+=deal(a[i].e);  
            w+=(sum[a[i].e]);  
            s+=two[a[i].e];  
        }  
    }  
    __int64 ans=0;  
    for(int i=b[k];i!=-1;i=a[i].next)  
    {  
        int y =a[i].e;  
        __int64 res=0;  
        if(level[y]==level[k]+1&&two[y]!=0)  
        {  
            res+=((w-sum[y])*two[y]);  
        }  
        ans+=res;  
    }  
    s+=ans;  
    return s;  
}  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ZOJ 1092 Arbitrage Floyd算法 下一篇cocos2d-x Loading界面实现资源加..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C/C++ 类模板与模板 (2025-12-27 01:49:52)
·C语言 模板化<templ (2025-12-27 01:49:49)
·C/C++模板类模板与函 (2025-12-27 01:49:46)
·如何理解c语言指针和 (2025-12-27 01:19:11)
·为什么C标准库没有链 (2025-12-27 01:19:08)