zoukankan      html  css  js  c++  java
  • HDOJ 5416 CRB and Tree DFS



    CRB and Tree

    Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 690    Accepted Submission(s): 221


    Problem Description
    CRB has a tree, whose vertices are labeled by 1, 2, …, N. They are connected by N – 1 edges. Each edge has a weight.
    For any two vertices u and v(possibly equal), f(u,v) is xor(exclusive-or) sum of weights of all edges on the path from u to v.
    CRB’s task is for given s, to calculate the number of unordered pairs (u,v) such that f(u,v) = s. Can you help him?


     

    Input
    There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
    The first line contains an integer N denoting the number of vertices.
    Each of the next N - 1 lines contains three space separated integers ab and c denoting an edge between a and b, whose weight is c.
    The next line contains an integer Q denoting the number of queries.
    Each of the next Q lines contains a single integer s.
    1 ≤ T ≤ 25
    1 ≤ N ≤ 105
    1 ≤ Q ≤ 10
    1 ≤ ab ≤ N
    0 ≤ cs ≤ 105
    It is guaranteed that given edges form a tree.

     

    Output
    For each query, output one line containing the answer.
     

    Sample Input
    1 3 1 2 1 2 3 2 3 2 3 4
     

    Sample Output
    1 1 0
    Hint
    For the first query, (2, 3) is the only pair that f(u, v) = 2. For the second query, (1, 3) is the only one. For the third query, there are no pair (u, v) such that f(u, v) = 4.
     

    Author
    KUT(DPRK)
     

    Source
     


    /* ***********************************************
    Author        :CKboss
    Created Time  :2015年08月21日 星期五 14时10分39秒
    File Name     :HDOJ5416.cpp
    ************************************************ */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstdlib>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    
    using namespace std;
    
    typedef long long int LL;
    const int maxn=100100;
    const int MX=1e6+10;
    
    int n,Q;
    
    struct Edge
    {
    	int to,next,val;
    }edge[maxn*2];
    
    int Adj[maxn],Size;
    
    void init()
    {
    	memset(Adj,-1,sizeof(Adj)); Size=0;
    }
    
    void Add_Edge(int u,int v,int c)
    {
    	edge[Size].to=v;
    	edge[Size].next=Adj[u];
    	edge[Size].val=c;
    	Adj[u]=Size++;
    }
    
    
    int num[maxn];
    LL cnt[MX];
    
    void DFS(int u,int fa,int val)
    {
    	for(int i=Adj[u];~i;i=edge[i].next)
    	{
    		int v=edge[i].to;
    		int c=edge[i].val;
    		if(v==fa) continue;
    		num[v]=num[u]^c;
    		DFS(v,u,num[v]);
    	}
    }
    
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
    
    	int T_T;
    	scanf("%d",&T_T);
    	while(T_T--)
    	{
    		scanf("%d",&n);
    		init();
    		for(int i=0,a,b,c;i<n-1;i++)
    		{
    			scanf("%d%d%d",&a,&b,&c);
    			Add_Edge(a,b,c); Add_Edge(b,a,c);
    		}
    		memset(cnt,0,sizeof(cnt));
    		DFS(1,1,0);
    		for(int i=1;i<=n;i++) cnt[num[i]]++;
    		scanf("%d",&Q);
    		while(Q--)
    		{
    			int x;
    			scanf("%d",&x);
    			LL ans=0;
    
    			for(int i=1;i<=n;i++)
    			{
    				int u=num[i];
    				int v=x^u;
    				ans=ans+cnt[v];
    			}
    			if(x==0) ans+=n;
    			printf("%lld
    ",ans/2);
    		}
    	}
        
        return 0;
    }
    




  • 相关阅读:
    asp中动态include的方法
    asp存储过程使用大全
    用vb6写asp组件的简单例子
    asp中遍历一些对象(request,session,Application)
    查看ASP Session 变量的小工具
    层不能跨框架(包括TEXTAREA)显示的解决办法
    保存远程图片到本地 同时取得第一张图片并创建缩略图
    使用.Net开发asp组件
    使用ASP在IIS创建WEB站点
    解析notes自带的rtf javaapplet编辑器
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6877783.html
Copyright © 2011-2022 走看看