A 小K的疑惑 找规律

感觉题意没讲明白ii,j,k。。。。

以下摘自他人博客:https://www.cnblogs.com/eason9906/p/11754846.html

画画图可以发现dis[i][j]==dis[j][k]==dis[i][k]这个连等式等于1是不可能的,只能是等于0。这个连等式等于0,说明了i到j的距离,j到k的距离以及i到k的距离都是偶数,此时我们选取一号节点作为树的根节点,则对i和j有个结论,若i到j的距离为偶数,则i到根节点,和j到根节点的距离的奇偶性相同,这里设到根节点距离为奇数的点的个数为x,为偶数的点的个数为y,则满足条件的(i,j,k)的个数为x^3+y^3.

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=1e4+10;
 5 struct node
 6 {
 7     int ed,w;
 8     node(int edd=0,int ww=0)
 9     {
10         ed=edd;
11         w=ww;
12     }
13 };
14 vector<node>g[maxn];
15 int n,x,y;
16 void dfs(int now,int d,int fa)
17 {
18     if(d&1)
19         x++;
20     else
21         y++;
22     int sz=g[now].size();
23     for(int i=0;i<sz;i++)
24     {
25         int e=g[now][i].ed,w=g[now][i].w;
26         if(e==fa) continue;
27         dfs(e,d+w,now);
28     }
29 }
30 int main()
31 {
32     scanf("%d",&n);
33     for(int i=1;i<n;i++)
34     {
35         int s,e,w;
36         scanf("%d %d %d",&s,&e,&w);
37         g[s].push_back(node(e,w));
38         g[e].push_back(node(s,w));
39     }
40     dfs(1,0,0);
41     printf("%lld\n",(ll)x*x*x+(ll)y*y*y);
42     return 0;
43 }
View Code

 

posted @ 2020-08-05 20:29  古比  阅读(155)  评论(0编辑  收藏  举报