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 }