图论习题
1.树的搜索的板子题。每次修改的时候在子树根节点标记,并且向下传递dfs即可

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define endl '\n' 4 #define ll long long 5 #define cy cout << "YES" << endl 6 #define cn cout << "NO" << endl 7 int _,n,m; 8 const int N = 2e5 + 10,inf = 1e9; 9 const int mod = 1e9 + 7; 10 int c[N]; 11 vector<int> g[N]; 12 13 void dfs(int u,int fa){ 14 c[u] += c[fa]; 15 for(int v : g[u]) 16 if(v != fa) 17 dfs(v,u); 18 } 19 20 int main() 21 { 22 cin >> n >> m; 23 for (int i = 1,u,v; i < n; i ++ ){ 24 scanf("%d %d", &v, &u); 25 g[u].push_back(v); 26 g[v].push_back(u); 27 } 28 29 for (int i = 1,a,b; i <= m; i ++ ){ 30 scanf("%d %d", &a, &b); 31 c[a] += b; 32 } 33 dfs(1,0); 34 for (int i = 1; i <= n; i ++ ) cout << c[i] << " "; 35 cout << endl; 36 return 0; 37 }
2.首先vector构图,然后通过两种不同的颜色计分,如果分数为0则平衡 + 1
然后dfs从第一个根节点开始搜索

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define endl '\n' 4 #define int long long 5 #define cy cout << "YES" << endl 6 #define cn cout << "NO" << endl 7 int _,n,m,cnt; 8 const int N = 4e3 + 10,inf = 1e9; 9 const int mod = 1e9 + 7; 10 int color[N],a[N]; 11 vector<int> g[N]; 12 13 int dfs(int u) 14 { 15 int sum = color[u];//记录根节点的分数 16 for (int i = 0; i < g[u].size(); i ++ ) sum += dfs(g[u][i]); //搜索以u为根节点的每个儿子的分数 17 if(sum == 0) cnt ++; //如果平衡,数量 + 1 18 return sum; 19 } 20 21 signed main() 22 { 23 cin >> _; 24 while(_ -- ){ 25 for (int i = 1; i <= n; i ++ ) g[i].clear(); 26 char c; 27 cin >> n; 28 cnt = 0; 29 for (int i = 2; i <= n; i ++ ) cin >> a[i]; 30 31 //g[1].push_back(1); 32 for (int i = 2; i <= n; i ++ ){ 33 g[a[i]].push_back(i); 34 } 35 for (int i = 1; i <= n; i ++ ){ 36 cin >> c; 37 if(c == 'W') color[i] = -1; 38 else color[i] = 1; 39 } 40 41 dfs(1);//根节点是1 42 cout << cnt << endl; 43 } 44 return 0; 45 }