第19届PTA天梯赛 鱼与熊掌+满树的遍历

鱼与熊掌

《孟子 · 告子上》有名言:“鱼,我所欲也,熊掌,亦我所欲也;二者不可得兼,舍鱼而取熊掌者也。”

先保存每个人所拥有的物品种类编号,记录下后续需要计数

接下来输入一对物品种类编号,遍历所有人,计数即可

使用C++的STL即可

代码如下:

#include<iostream>
#include<unordered_set>
#include<vector>
using namespace std;
struct node
{
    int x, y;
};
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);      //不加容易超时
    int n, m;
    cin >> n >> m;
    vector<unordered_set<int>> vec(n);
    for (int i = 0; i < n; i++)
    {
        int k, a;
        cin >> k;
        for (int j = 0; j < k; j++)
        {
            cin >> a;
            vec[i].insert(a);
        }
    }
    cin >> m;
    //1.
    // for (int i = 0; i < m; i++)
    // {
    //     int a, b,num=0;
    //     cin >> a >> b;
    //     for (int i = 0; i < n; i++)
    //          if (vec[i].find(a) != vec[i].end() && vec[i].find(b) != vec[i].end())
    //                 num++;
    //     cout << num << "\n";
    // }
    //2.
    node arry[100];
    int ans[100];
    for (int i = 0; i < m; i++)
       ans[i] = 0;
    for (int i = 0; i < m; i++)
       cin >> arry[i].x >> arry[i].y;
    for (int i = 0; i < n; i++)
       for (int j = 0; j < m; j++)
           if (vec[i].find(arry[j].x) != vec[i].end() && vec[i].find(arry[j].y) != vec[i].end())
               ans[j]++;
    for (int j = 0; j < m; j++)
       cout << ans[j] << "\n";
    return 0;
}

代码也是写了两种方式,顺序不同而已,没什么思路上的差距。

满树的遍历

输入每个结点的父结点,同时看看哪个是root,记录下来,并且把每个结点下的子节点保存起来,具体怎么保存,看代码!

然后去查看一下他们的度是否一致,根节点除外(根节点度就是0),度不是零就一定是同一个数

如果不是 输出no 否则输出yes

然后去前序遍历一下就好了,具体执行看代码。

#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> v;
void dfs(int x)
{
    if(v[x].size()==0)return;
    for(auto i:v[x])
    {
        cout<<" "<<i;
        dfs(i);
    }
}
int main()
{
    int n;
    cin>>n;
    v.resize(n+1);
    int root=0;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        if(a==0)
            root=i;
        v[a].push_back(i);
    }
    int du=v[root].size();
    bool pl=true;
    for(int i=1;i<=n;i++)
        if(v[i].size()!=0&&v[i].size()!=du)
        {
            pl=false;
            if(v[i].size()>du)
                du=v[i].size();
        }
    cout<<du<<" ";
    if(pl)
        cout<<"yes\n";
    else
        cout<<"no\n";
    cout<<root;
    dfs(root);
    return 0;
}

大家不懂多多评论区交流,互相请教互相帮助,没准别人一句话就点通你(亲身经历)

 期待和大家共同加油,希望大家不断进步!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值