图论习题

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 }
Code
复制代码

 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 }
Code
复制代码

 

posted @   rw156  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示