1. 程式人生 > >牛客網練習賽30 小K的疑惑 (思維)

牛客網練習賽30 小K的疑惑 (思維)

題意 中文題意,主要是i,j,ki,j,k可以重複。 思路 可以看出,dis(i,j)dis(i,j) 的距離不是0就是1,那麼我們要找到其實就是在兩堆集合裡面,一個集合裡面所有的值都是1,另一個集合裡面所有的值都是0,之後在1這個集合裡面去隨意選三個數,在0這個集合裡面去隨意選3個數就好,那麼現在的問題就是說我們如何去構造這兩個集合了,正解是我們去求每個點到根節點的距離的奇偶,奇數和奇數放在一個集合,偶數和偶數放在一個集合,證明一下這個東西吧,就是找三個數字都到根節點的距離是奇數,那麼他們兩兩相連的肯定就是偶數啊,偶數也一樣 。 程式碼

#include <bits/stdc++.h>
using namespace std; const int maxn = 10000 + 10; vector<pair<int,int> >V[maxn]; int dis[maxn]; void dfs(int u,int fa) { for(int i = 0 ; i < V[u].size() ; i ++) { int v = V[u][i].first; int c = V[u][i].second; if(v == fa) continue; dis[v] = dis[u] + c; dfs(v,u); } } int main()
{ int n , u , v,z; scanf("%d",&n); for(int i = 0 ; i < n - 1 ; i ++) { scanf("%d%d%d",&u,&v,&z); V[u].push_back(make_pair(v,(z))); V[v].push_back(make_pair(u,(z))); } dis[1] = 0; dfs(1,0); int x = 0 , y = 0; for(int i = 1 ; i <= n ; i++) { if(dis[i] & 1) x ++
; else y ++; } cout<<1LL * x*x*x+1LL *y*y*y<<endl; }