牛客網練習賽30 小K的疑惑 (思維)
阿新 • • 發佈:2018-12-19
題意 中文題意,主要是可以重複。 思路 可以看出, 的距離不是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;
}