开始用的是map,但是发现怎末也过不去,还以为是dfs不行,就换成了bfs,但还是不行。最后看了别人的代码换成了vecotr就成了。。。。
思路:
1:路径通过对2取模之后,只剩下0或1,任意找一个结点,然后从这个结点往下开始dfs,记录到这个结点的距离是0的个数n。则这n+1(包括这个起始结点本身)可以从中间选取三个点符合条件。剩余的点就又是另外的一种情况(他们到起始结点的距离为1,但是他们之间的距离是0)。
2:看了题解才发现,ijk可以值一个点,也可以是(1,1,2)(2,1,1,)(1,2,1)这几种情况
链接:https://ac.nowcoder.com/acm/contest/216/C
来源:牛客网
题目描述
众所周知,小K是一只连NOIP2018初赛都没有过的蒟蒻,所以小K很擅长dfs序+分块树,但是本题与dfs序+分块树无关。
小K现在心态爆炸了,因为小K被一道简单的数据结构题给卡住了,希望请你来解决它,但是小K又不想太麻烦你,于是将题面进行了简化(其实是出题人懒得写题面了233333):
Bob有?个点的树,每条边的长度有一个边权,现在定义???(?,?)代表第?个点到第?个点的距离模2之后的结果。问有多少(?,?,?)满足,???(?,?) = ???(?,?) = ???(?,?)。
输入描述:
第一行一个整数?代表点的数量。 接下来? − 1行每行三个数?,?,?代表有一条在?,?之间长度为?的边。
输出描述:
一行一个整数代表有多少对(?,?,?)满足条件。
示例1
输入
复制
3 1 2 3 1 3 4
输出
复制
9
备注:
对于100%的数据,1 ≤ ? ≤ 10000,0 ≤ ? ≤ 233。
//我是用的是结构体,通过可变长的数组
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=10000+10;
vector<pair<int,int> > v[maxn];
int cnt=0;
void dfs(int now,int fa,int sum)//sum为路径和
{
sum%=2;
if(0==sum) cnt++;
int i,next;
for(i=0;i<v[now].size();i++){
next=v[now][i].first;
if(next!=fa){
dfs(next,now,sum+v[now][i].second);
}
}
return ;
}
int main()
{
int N,i,j,k,p,q,l;
cin >> N;
for(i=1;i<N;i++){
scanf("%d%d%d",&p,&q,&l);
v[p].push_back(pair<int,int>(q,l%2));
v[q].push_back(pair<int,int>(p,l%2));
}
dfs(1,-1000,0);
ll cnt2=N-cnt;
ll result=0;
result=(ll)(pow((double)cnt,3)+pow((double)cnt2,3));
cout << result << endl;
return 0;
}