2019 计蒜之道 初赛 第一场 A商汤的AI伴游小精灵

    xiaoxiao2023-11-16  155

    A 题目 题解:贪心, 暴力可过,建立一棵树,选择其中任意两点删除,然后算出有几颗树 计算有几颗树的方法:见代码

    #include <iostream> #include<vector> #include<algorithm> using namespace std; struct node { int fa; vector<int> son; }p[10000]; struct number { int num; int cnt; }q[10000]; bool cmp(number a,number b) { return a.cnt>b.cnt; } int main() { int n;cin>>n; for(int i=1;i<=n;i++) p[i].fa=i; for(int i=1;i<n;i++) { int s,f; cin>>f>>s; p[s].fa=f; p[f].son.push_back(s); } //for(int i=1;i<=n;i++) cout<<p[i].son.size()<<endl; int cnt=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { int k=p[i].son.size()+p[j].son.size();///计算两个节点总共子节点的数量 if(p[i].fa==j||p[j].fa==i) k--;///若他们相连,即其中一个的父亲是另一个,则树的数目比节点数少一 if(i!=1&&j!=1)k++;///再判断,是否其中一个是1节点,都不是则树的数目加一 ///(例子如下,删去2,3则树的数目(为5)比总共子节点数(4)多1 cnt=max(cnt,k);///找出最大的树的数目 } } cout <<cnt<< endl; return 0; } /* 1 2 3 4 5 6 7 8 9 10*/ /* 1 4 5 6 7 8 9 10*/
    最新回复(0)