我模拟了这个样例
5 2
2 1
2 3
3 4
3 5
1 2 0 2 0
过掉的代码输出的结果为
// 0 0 0
// 2 1 1
// 1 0 1
// 0 0 0
// 0 0 0
可是这个样例的图是这样的
2 (1)
/ \
(2) 1 3 (0)
/ \
(2) 4 5 (0)
我的代码是这样输出
// 0 0 0
// 2 0 2
// 1 0 1
// 0 0 0
// 0 0 0
我不能确定是我理解错题意了还是题目本身有问题
附上我错误的代码
#include <bits/stdc++.h>
using namespace std;
#define all(c) (c).begin(), (c).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
#define Sum(a) accumulate((a).begin(), (a).end() , 0ll)
#define Min(a) *std::min_element((a).begin(), (a).end())
#define Max(a) *std::max_element((a).begin(), (a).end())
#define rev(a) reverse((a).begin(), (a).end())
#define each(x, a) for(auto& x : a)
#define mst(a, x) memset(a, x, sizeof(a))
#define LL long long
#define rep(i, from, to) for(ll i = from;i<to;i++)
#define rrep(i, from, to) for(ll i = from;i>to;i--)
#define to_uni(a) a.erase(unique(begin(a), end(a)), end(a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pp pop_back
#define endl "\n"
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int mod = 1e9 + 7;
const int P = 998244353;
const int INF = 0x3f3f3f3f;
const int dx[4]={1, 0, -1, 0}, dy[4]={0, 1, 0, -1};
const int fx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, fy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int N = 2e6 + 10;
int n,root;
int e[N],h[N],ne[N],idx,w[N];
int cnt[N][3];
std::vector<int> v;
void add(int a ,int b)
{
e[idx] = b,ne[idx] = h[a] , h[a] = idx ++ ;
}
void dfs(int u,int dad)
{
for(int i = h[u]; ~i ; i = ne[i])
{
int j = e[i];
if(j == dad) continue;
dfs(j,u);
for(int k = 0 ; k < 3 ; k ++)
cnt[u][k] += cnt[j][k];
}
cnt[u][w[u]]++;
}
void solve() {
memset(h, -1, sizeof h);
cin >> n >> root;
v.pb(root);
for(int i = 0 ; i < n - 1 ; i ++) {
int x,y;
cin >> x >> y;
add(x, y);
add(y, x);
v.pb(y);
}
// for(int i = 1 ; i <= n ; i ++)
// {
// int x;
// cin >> x;
// w[i] = x;
// }这个是对的;或者把w设置为unorderedmap
for(int i = 0 ; i < n ; i ++) {
int x;
cin >> x;
// 将节点值作为下标储存颜色
w[v[i]] = x;
}
dfs(root, 0);
for(int i = 1 ; i <= n ; i ++)
{
cout << cnt[i][0] - (w[i] == 0)<< ' ' << cnt[i][1] - (w[i] == 1) << " " <<cnt[i][2] - (w[i] == 2) << endl;
// cout << cnt[i][0] - (w[i] == 0)<< ' ' << cnt[i][1] - (w[i] == 1) << " " <<cnt[i][2] - (w[i] == 2) << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while(t--)
solve();
return 0;
}
可能题目所描述中的
接下来一行共 n 个正整数,只含有0,1,2,表示第i个节点的颜色。应该改为是节点i的颜色是0,1,2吧。
全部评论
(1) 回帖