40分求调
查看原帖
40分求调
581107
poppingW楼主2023/8/5 07:54
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll long long
using namespace std;
const int N = 1e5 + 10,mod=1e9+7;
int n, m;
int head[N], color[N], to[N], nxt[N], idx;
ll dp[N][4];
bool vis[N];
inline void add(int u, int v) {
  to[idx] = v, nxt[idx] = head[u], head[u] = idx++;
}
void dfs(int pos) {
  vis[pos] = 1;
  if (color[pos])
    dp[pos][color[pos]] = 1;
  else 
    dp[pos][1] = 1,dp[pos][2] = 1,dp[pos][3] = 1;
  for (int i = head[pos]; ~i; i = nxt[i])  {
    int v=to[i];
    if (!vis[v]) {
      dfs(v);  
      dp[pos][1] = dp[pos][1] * ((dp[v][2] + dp[v][3]) % mod) % mod;
      dp[pos][2] = dp[pos][2] * ((dp[v][1] + dp[v][3]) %mod) %mod;
      dp[pos][3] = dp[pos][3] * ((dp[v][2] + dp[v][1]) %mod) %mod; 
    }
  }
}
int main() {
  memset(head,-1,sizeof head);
  int x, y;
  cin>>n>>m;
  for (int i = 1; i < n; ++i) {
    cin>>x>>y;
    add(x, y),add(y, x);
  }
  for (int i = 1; i <= m; ++i) {
    cin>>x>>y;
    color[x] = y; 
  }
  dfs(1); 
  cout << (dp[1][1] + dp[1][2] + dp[1][3]) %mod << endl;
  return 0;
}

前四个点AC 后面又WA又RE。。。

2023/8/5 07:54
加载中...