数树

数树

https://ac.nowcoder.com/acm/contest/7509/D

思路:
可以从度的角度来考虑
来考虑相连
如果是两个D>1的结点相连,我们知道这一定是两颗树合并了,那么树++,如果其中一个D=1,那就是一个点和并到了一颗树上,树的个数不变,如果两个D=0的点相连,树的个数++
接下来考虑断开
如果是两个D>1的结点断开,我们知道肯定是1棵树变成了2颗树。如果其中一个D=1,那么就是把一个叶子结点分出去了,树的个数不变。如果两个点的度都为1,那么分成的两个东西都是单个结点,树的数目--
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e8+7;
int n;
int D[maxn];
map<pair<int, int >, int> mp;
int main()
{
    int ans = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
        int type, u, v;
        cin >> type;
        if(type == 1){
            cin >> u >> v;
            if(u > v) swap(u, v);
            pair<int, int> pi = make_pair(u, v);
            if(mp[pi]){
                continue;
            }
            mp[pi] = 1;
            if(D[u] && D[v]){
                ans--;                //两棵树合并 
            }
            else if(D[u]==0 && D[v] == 0){
                ans++;                //两个结点连成一颗树 
            }
            D[u]++;
            D[v]++;
        }
        else if(type == 2){
            cin >> u >> v;
            if(u > v) swap(u, v);
            pair<int, int> pi = make_pair(u, v);
            if(!mp[pi]){
                continue;
            }
            mp[pi] = 0;
            if(D[u] > 1 && D[v] > 1){
                ans++;
            }
            else if(D[u] == 1 && D[v] == 1){
                ans--;
            }
            D[u]--;
            D[v]--;
        }
        else if(type == 3){
            cout << ans << endl;
        }
    }
 } 
全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务