• Equidistant Vertices-树型dp


    Description
    A tree is an undirected connected graph without cycles.

    You are given a tree of n vertices. Find the number of ways to choose exactly k vertices in this tree (i. e. a k-element subset of vertices) so that all pairwise distances between the selected vertices are equal (in other words, there exists an integer c such that for all u,v (u≠v, u,v are in selected vertices) du,v=c, where du,v is the distance from u to v).

    Since the answer may be very large, you need to output it modulo 109+7.

    Input
    The first line contains one integer t (1≤t≤10) — the number of test cases. Then t test cases follow.

    Each test case is preceded by an empty line.

    Each test case consists of several lines. The first line of the test case contains two integers n and k (2≤k≤n≤100) — the number of vertices in the tree and the number of vertices to be selected, respectively. Then n−1 lines follow, each of them contains two integers u and v (1≤u,v≤n, u≠v) which describe a pair of vertices connected by an edge. It is guaranteed that the given graph is a tree and has no loops or multiple edges.

    Output
    For each test case output in a separate line a single integer — the number of ways to select exactly k vertices so that for all pairs of selected vertices the distances between the vertices in the pairs are equal, modulo 109+7 (in other words, print the remainder when divided by 1000000007).

    Example
    input

    3
    
    4 2
    1 2
    2 3
    2 4
    
    3 3
    1 2
    2 3
    
    5 3
    1 2
    2 3
    2 4
    4 5
    

    output

    6
    0
    1
    
    typedef int itn;
    struct node{
    	int v,nex;
    }e[107 << 1];
    int head[107 << 1],cnt;
    int n,k;
    void init(){
    	cnt = 0;
    	for(int i=0;i<(107<<1);i++) head[i] = -1;
    }
    void add(int u,int v){
    	e[cnt].v = v;
    	e[cnt].nex = head[u];
    	head[u] = cnt ++;
    }
    int siz[107];
    bool vis[107];
    int dp[107][107];
    void dfs(int u,int fa,int dep,int pnt){
    	vis[u] = 1;
    	if(dep == pnt){
    		siz[u] ++;
    		return;
    	}
    	for(int i=head[u];~i;i=e[i].nex){
    		int to = e[i].v;
    		if(to == fa) continue;
    		dfs(to,u,dep+1,pnt);
    		siz[u] += siz[to];
    	}
    }
    int main()
    {
    	int _ = read;
    	while(_ --){
    		n = read,k = read;
    		init();
    		for(int i=1;i<n;i++){
    			int u = read,v = read;
    			add(u,v);
    			add(v,u);
    		}
    		ll ans = 0;
    		if(k == 2){
    			ans = n * (n - 1) / 2 % mod;
    			printf("%lld
    ",ans);
    			continue;
    		}
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				memset(vis,0,sizeof vis);
    				memset(siz,0,sizeof siz);
    				memset(dp,0,sizeof dp);
    				dfs(i,0,0,j);
    				dp[0][0] = 1;
    				int it = 0;
    				for(int tj = head[i];~tj;tj=e[tj].nex){
    					int to = e[tj].v;
    					if(siz[to] == 0) continue;
    					for(int kk=0;kk<=it;kk++){
    						dp[it+1][kk] += dp[it][kk];
    						dp[it+1][kk] %= mod;
    						dp[it+1][kk+1] += dp[it][kk] * siz[to] % mod;
    						dp[it+1][kk+1] %= mod;
    					}
    					it ++;
    				}
    				ans += dp[it][k];
    				ans %= mod;
    			}
    		}
    		printf("%lld
    ",ans);
    	}
        return 0;
    }
    
  • 相关阅读:
    bzoj1626[Usaco2007 Dec]Building Roads 修建道路*
    bzoj1610[Usaco2008 Feb]Line连线游戏*
    bzoj1666[Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏*
    bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声*
    bzoj1606[Usaco2008 Dec]Hay For Sale 购买干草*
    bzoj1264[AHOI2006]基因匹配Match
    bzoj4518[Sdoi2016]征途
    bzoj2049[Sdoi2008]Cave 洞穴勘测
    bzoj4514[Sdoi2016]数字配对
    bzoj2429[HAOI2006]聪明的猴子
  • 原文地址:https://www.cnblogs.com/PushyTao/p/15101038.html
Copyright © 2020-2023  润新知