首页 > 其他分享 >D - Erase Leaves

D - Erase Leaves

时间:2023-12-16 22:34:02浏览次数:25  
标签:int oneadjnodecnt Leaves Erase void Graph adj 节点

D - Erase Leaves

https://atcoder.jp/contests/abc333/tasks/abc333_d

 

思路

把这个图看成一棵树, 1作为树根,

统计 1树根关联的 子节点作为根的子树的总节点数,

去除 子树中总节点数最大子的 子树, 其它子树的总节点 记做贡献, 最后+1 (对应1节点)。

 

同时注意一个特殊情况, 1仅有一个子树的情况, 1退化为叶子节点, 只需要一次操作。

 

Code

https://atcoder.jp/contests/abc333/submissions/48592800

/******************************** GRAPH START ***************************************/
// Graph class represents a directed graph
// using adjacency list representation
class Graph {
public:
    map<int, int> nodecnt;
    map<int, bool> visited;
    map<int, vector<int> > adj;

    // function to add an edge to graph
    void addEdge(int v, int w);

    // DFS traversal of the vertices
    // reachable from v
    void DFS(int v);
};

void Graph::addEdge(int v, int w)
{
    adj[v].push_back(w); // Add w to v’s list.
    adj[w].push_back(v); // Add w to v’s list.
}

void Graph::DFS(int v)
{
    // Mark the current node as visited and
    // print it
    visited[v] = true;
//    cout << v << " ";

    if (adj[v].size() == 0){
        nodecnt[v] = 1;
        return;
    }

    // Recur for all the vertices adjacent
    // to this vertex
    list<int>::iterator i;
    long long nodesnum = 1;
    
    for (auto one: adj[v]){
        if (!visited[one]){
            DFS(one);

            nodesnum += nodecnt[one];
        }
    }
    
    nodecnt[v] = nodesnum;
}

/******************************** GRAPH END ***************************************/

/*
https://atcoder.jp/contests/abcxxx/tasks/abcxxx_d
*/

int n;

class Graph g;

int main()
{
    cin >> n;
    
    for(int i=1; i<n; i++){
        int u,v;
        
        cin >> u >> v;
        
        g.addEdge(u, v);
    }
    
    if(g.adj[1].size() == 1){
        cout << 1 << endl;
        return 0;
    }
    
    g.DFS(1);


    vector<int> oneadjnodecnt;
    
    int oneadj_len = g.adj[1].size();
    for(int i=0; i<oneadj_len; i++){
        int oneadj_i = g.adj[1][i];
        int nodes_i = g.nodecnt[oneadj_i];

        oneadjnodecnt.push_back(nodes_i);

//        if (minnodes > nodes_i){
//            minnodes = nodes_i;
//        }
    }

    sort(oneadjnodecnt.begin(), oneadjnodecnt.end());

    int nodenumsum = 0;
    int oneadjnodecnt_len = oneadjnodecnt.size();
    for(int i=0; i<oneadjnodecnt_len-1; i++){
        nodenumsum += oneadjnodecnt[i];
    }

    cout << nodenumsum+1 << endl;

    return 0;
}

 

标签:int,oneadjnodecnt,Leaves,Erase,void,Graph,adj,节点
From: https://www.cnblogs.com/lightsong/p/17908505.html

相关文章

  • Secure Eraser 免费的数据清除软件
    SecureEraser是一款免费的数据清除软件,它可以帮助用户完全删除计算机上的文件和文件夹,以确保这些数据不会被恶意软件或他人恢复。该软件被广泛应用于保护个人隐私和商业机密信息。此程序将彻底删除您的敏感数据,并提供了一个易于使用的用户界面。安装后默认是英文版的,你可以如下图......
  • AT_abc321_f [ABC321F] #(subset sum = K) with Add and Erase 题解
    AT_abc321_f[ABC321F]#(subsetsum=K)withAddandErase题解题目大意现在有一个空箱子。给你两个数\(Q,K\),然后给你\(Q\)行,每一行代表一个操作:\(+x\),即向箱子里加一个权值为\(x\)的小球。\(-x\),即从箱子里把权值为\(x\)的小球拿一个出来。保证合法,即箱子......
  • flutter升级错误“Your flutter checkout has local changes that would be erased by
    在升级FlutterSDK时可能会报如下错误:Yourfluttercheckouthaslocalchangesthatwouldbeerasedbyupgrading.Ifyouwanttokeepthesechanges,itisrecommendedthatyoustashthemvia“gitstash”orelsecommitthechangestoalocalbranch.Ifitisok......
  • CF1385 F. Removing Leaves 换根dp
    CF1385F.RemovingLeaves换根dp题目链接题意:给你一棵树,有一种操作,选择k个叶子,若叶子节点的父亲相同,则可删去这k个节点,问你最多能操作多少次。做法:这题的官方做法是贪心+bfs,不过用换根dp的方法也是可做的。首先我们常规选择节点1为根节点,跑一遍dfs,主要记录下面这些变量......
  • AGC064C Erase and Divide Game
    题面传送门首先考虑你只插入若干个数怎么做:按位从低到高插入一棵Trie,问题就变成:在Trie上每次可以往左儿子走或者往右儿子走,如果当某个人操作的时候为空节点那么这个人就输了。如果我们可以将这棵树建出来那么这个问题就是好解决的,可惜建不出来。仿照从高到低建Trie的方法,将......
  • PAT-甲级-1004 Counting Leaves C++
    Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetestcase.Eachcasestartswithalinecontaining 0<N<100,thenumberofnode......
  • 【c&c++】erase怎么用c语言,C++ erase()函数使用时的注意点
    遇见的场景删除vector容器指定元素时;erase()函数的用法vector::erase():从指定容器删除指定位置的元素或某段范围内的元素。具体用法如下:iteratorerase(iterator_Where);删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;iteratorerase(iterator_First,i......
  • c++string的erase方法
    erase函数的原型如下:(1)string&erase(size_tpos=0,size_tn=npos);(2)iteratorerase(iteratorposition);(3)iteratorerase(iteratorfirst,iteratorlast);也就是说有三种用法:(1)erase(pos,n);删除从pos开始的n个字符,比如erase(0,1)就是删除第一......
  • Uva--699 The Falling Leaves,(二叉树的递归遍历)
    记录10:462023-5-20http://uva.onlinejudge.org/external/6/699.htmlreference:《算法竞赛入门经典第二版》例题6-10二叉树的层次遍历,边读边写(这些题给我感觉是非常灵活),对每个节点需要的数据就是在sum数组的位置#include<cstdio>#include<iostream>#include<sstream>#d......
  • PAT Advanced 1004. Counting Leaves
    PATAdvanced1004.CountingLeaves1.ProblemDescription:Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.2.InputSpecification:Eachinputfilecontainsonetestcase.Eachcases......