首页 > 代码库 > 搜索场 day1A 天平

搜索场 day1A 天平

A 天平

时间限制: 1 Sec  空间限制: 256 MB

输入输出文件名:A.in,A.out

题目描述

给出N1N20)个整数(数字在1...100,000,000之间)在其中选若干个数,如果这几个数可以分成两个和相等的集合,那么方案数加1。问总方案数。

 

输入格式:

第一行为n,第二行为n个数字。

输出格式:

输出方案数

输入样例

4

1 2 3 4

 

输出样例

3

样例解释

{1,2,3},{1,3,4},{1,2,3,4}三种方案。

数据范围

存在部分数据点n<=10

对于100%的数据,1<=n<=20

 

技术分享
#include<cstdio>
#include<cstring>
#define ll long long 
using namespace std;
const int N=100010;
struct node
{
    int next,to,p;
}e[N*2];
int first[N],book[N],size[N];
int cnt=0;
ll sum=0;
int n;

void insert(int v,int u,int p)
{
    e[++cnt].to=v;e[cnt].next=first[u];first[u]=cnt;e[cnt].p=p;
    e[++cnt].to=u;e[cnt].next=first[v];first[v]=cnt;e[cnt].p=p;
}

void dfs1(int x)
{
    book[x]=1;size[x]=1;
    for(int i=first[x];i;i=e[i].next)
    {
        if(book[e[i].to]==0)
        {
            dfs1(e[i].to);
            size[x]+=size[e[i].to];
        }
    }
}

void dfs(int x)
{
    book[x]=1;
    for(int i=first[x];i;i=e[i].next)
    {
        if(book[e[i].to]==0)
        {
            sum+=(ll)e[i].p*size[e[i].to]*(n-size[e[i].to]);
            dfs(e[i].to);
        }
    }
}

int main()
{
    freopen("A.in","r",stdin);
    freopen("A.out","w",stdout);
    scanf("%d",&n);
    int v,u,p;
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d %d %d",&u,&v,&p);
        insert(u,v,p);
    }
    memset(book,0,sizeof(book));
    dfs1(1);
    memset(book,0,sizeof(book));
    dfs(1);
    printf("%lld\n",sum);
}
View Code

 

技术分享

 

 谢谢师兄(czl)教导。

 

搜索场 day1A 天平