寒假刷题第17天

news/2024/7/7 22:46:59

PTA甲级

1118 Birds in Forest

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>

using namespace std;

const int N = 1e4 + 10;
int n , p[N];
set<int>se , st;
int bird;

int find(int x)
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    cin >> n;
    for(int i = 1;i < N;i ++) p[i] = i;
    for(int i = 0;i < n;i ++)
    {
        int k;
        cin >> k;
        int last = -1;
        for(int j = 0;j < k;j ++)
        {
            if(!j) cin >> last;
            else 
            {
                int x;
                cin >> x;
                int fa = find(x) , fb = find(last);
                if(fa != fb) p[fa] = fb;
                last = x;
            }
            st.insert(last);
            bird = max(bird , last);
        }
    }
    for(int i : st)
        se.insert(find(i));
    cout << se.size() << " " << bird << endl;
    cin >> n;
    while(n --)
    {
        int x , y;
        cin >> x >> y;
        if(find(x) == find(y)) puts("Yes");
        else puts("No");
    }
    return 0;
}

1119 Pre- and Post-order Traversals

使用字符串作为答案进行枚举更为简单

#include<iostream>
#include<cstring>
#include<vector>

using namespace std;

const int N = 100;
int n;
int pre[N] , post[N];

int build(int pr , int pl , int tr , int tl , string &res)
{
    if(pr > pl) return 1; // 建完方案数+1
    if(pre[pr] != post[tl]) return 0;
    int root = pre[pr];
    int cnt = 0;
    for(int i = pr;i <= pl;i ++)
    {
        string lv , rv;
        int l = build(pr + 1 , i , tr , tr + i - pr - 1 , lv);
        int r = build(i + 1 , pl , tl - pl + i , tl - 1 , rv);
        if(l && r) // 左右都建完
        {
            res = lv + to_string(root) + " " + rv;
            cnt += l * r;
            if(cnt > 1) break;
        }
    }
    return cnt;
}


int main()
{
    cin >> n;
    for(int i = 0;i < n;i ++) cin >> pre[i];
    for(int i = 0;i < n;i ++) cin >> post[i];
    string res;
    int cnt = build(0 , n - 1 , 0 , n - 1 , res);
    if(cnt == 1) puts("Yes");
    else puts("No");
    res.pop_back();
    cout << res << endl;
    return 0;
}

1122 Hamiltonian Cycle

#include<iostream>
#include<vector>
#include<set>

using namespace std;

const int N = 210 , M = 1e5 + 10;
int n , m;
bool g[N][N];

bool check(vector<int>&v , int k)
{
    if(v[0] != v[k - 1]) return false; // 保证是一个环
    set<int>se;
    for(int i = 0;i < k;i ++)
        se.insert(v[i]);
    if(se.size() != n) return false;
    for(int i = 1;i <= n;i ++)
        if(!se.count(i)) return false;
    for(int i = 1;i < k;i ++)
        if(!g[v[i]][v[i - 1]] && !g[v[i - 1]][v[i]]) return false;
    return true;
}

int main()
{
    cin >> n >> m;
    for(int i = 0;i < m;i ++)
    {
        int a , b;
        cin >> a >> b;
        g[a][b] = g[b][a] = true;
    }
    cin >> m;
    while(m --)
    {
        vector<int>v(M);
        int k;
        cin >> k;
        for(int i = 0;i < k;i ++)
            cin >> v[i];
        if(check(v , k) && k - 1 == n) puts("YES");
        else puts("NO");
    }
    return 0;
}

1126 Eulerian Path

注意图有可能是非联通的

#include<iostream>

using namespace std;

const int N = 510;
int n , m;
int in[N];
bool st[N] , g[N][N];

void dfs(int u)
{
    st[u] = true;
    for(int i = 1;i <= n;i ++)
        if(!st[i] && g[u][i]) dfs(i);
}


void euler()
{
    int cnt = 0;
    bool f = true;
    for(int i = 1;i <= n;i ++)
    {
        if(!st[i]) f = false;
        if(i == 1) cout << in[i];
        else cout << " " << in[i];
        if(in[i] & 1) cnt ++;
    }
    cout << endl;
    if(cnt == 0 && f) puts("Eulerian");
    else if(cnt == 2 && f) puts("Semi-Eulerian");
    else puts("Non-Eulerian");
}

int main()
{
    cin >> n >> m;
    while(m --)
    {
        int a , b;
        cin >> a >> b;
        g[a][b] = g[b][a] = true;
        in[a] ++ , in[b] ++;
    }
    dfs(1); // 有可能是非连通图
    euler();
    return 0;
}


http://lihuaxi.xjx100.cn/news/1998763.html

相关文章

【工具】raw与jpg互转python-cpp

在工作中常常需要将图像转化为raw数据或者yuv数据&#xff0c;这里将提供 cpp 版本和 python 版本的互转代码 代码链接见文档尾部。 cpp 版本 jpg2raw.cpp #include <fstream> #include <iostream> #include <opencv2/core.hpp> #include <opencv2/hig…

☻C++ QA

0. 什么是“第一性原理”&#xff1f; 函数指针的定义泛式与原理&#xff1f;联合(union)的原理是怎样的&#xff1f;联合类型对象的指针是什么意思&#xff1f;命名空间在.h和.cpp中怎么定义和使用&#xff0c;是什么原理&#xff1f;静态变量/函数在.h和.cpp中怎么定义和使用…

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后&#xff0c;私人的NAS热度快速上升&#xff0c;其中最…

.config配置文件解析(解析<appSettings>中key、value信息)

using System; using System.Text.RegularExpressions;public class Example {/// <summary>/// 解析<appSettings>中key、value信息/// using System.Text.RegularExpressions;/// </summary>/// <returns></returns>public static void Main()…

Oracle 备份 还原 导入 导出 数据库

目录 导出数据 导入数据 导出数据 SQL> conn / as sysdba Connected. SQL> create directory lxw_dir as /home/oracle;Directory created.SQL> grant write,read on directory lxw_dir to lxw;Grant succeeded.SQL> exit Disconnected from Oracle Database 11…

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意&#xff1a; 如果搭建在个人服务器或者内网中&#xff0c;需要做内网穿透&#xff0c;可以看这篇博客&#xff1a; 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次&#xff0c;点赞8次&#xff0c;收藏8次。真的很详细https://blog.csd…

Packet Tracer - Configure and Verify a Site-to-Site IPsec VPN Using CLI

Packet Tracer - 使用命令行界面配置和验证站点到站点IPsec VPN 地址表 目标 验证整个网络的连通性。 配置R1以支持与R3之间的站点到站点IPsec VPN。 背景/场景 网络拓扑图显示了三个路由器。您的任务是配置R1和R3&#xff0c;以便在各自局域网&#xff08;LAN&#xff09…

Kubernetes 基础详解

大家好&#xff0c;我是升仔 Kubernetes 概述 Kubernetes起源于Google&#xff0c;它的核心理念是帮助你在集群中自动部署、扩展和运行应用程序容器。简单来说&#xff0c;它就像一个智能的容器管理员&#xff0c;能够确保你的应用始终运行在最适合的地方。 Kubernetes的基本…