1. 程式人生 > >NowCoder--牛客練習賽30 C_小K的疑惑

NowCoder--牛客練習賽30 C_小K的疑惑

題目連結 :牛客練習賽30 C_小K的疑惑

i j k 可以相同 而且 距離%2 只有 0 1兩種情況 我們考慮 因為要 d(i j)=d(i k)=d(j k) 所以我們只能找 要麼三個點 任意兩個點之間的距離都是 1  要麼都是 0

所以我們先吧每個點到根節點的距離表示出來 找到有 x個 距離為1 y個距離為0 的點    當 選擇距離是1 的時候 我們假設任選一個數 首先確定了 i 這個值  j 可以選x個數  k也可以選x個數 (因為包含了他自己本身的距離為 0) 然後又有 x 個數 所以 當選擇 距離是1 的時候  答案是x^3         0 的情況同理

#include<bits/stdc++.h>
using namespace std;
#define maxn 10010
#define pii pair<int,int>
int dis[maxn];
vector<pii>q[maxn];
void dfs(int u,int fa,int z){
 dis[u]=z;
 for(int j=0;j<q[u].size();j++){
     int v=q[u][j].first;
     int va=q[u][j].second;
     if(v!=fa){
         dfs(v,u,va
+z); } } } int main(){ int n; cin>>n; memset(dis,0,sizeof(dis)); for(int j=0;j<n-1;j++){ int x,y,z; cin>>x>>y>>z; q[x].push_back(pii(y,z)); q[y].push_back(pii(x,z)); } dfs(1,0,0); int x=0,y=0; for(int j=1;j<=n;j++){
if(dis[j]%2) x++; else y++; } //cout<<x<<" "<<y<<endl; long long ans=1LL*x*x*x+1LL*y*y*y; cout<<ans<<endl; return 0; }