D. Friendly Spiders(bfs+筛法)

news2024/11/19 4:17:09

传送门

题意:

给你n个蜘蛛,每个蜘蛛有自己的腿数,如果某两个蜘蛛可以直接联系,那么这两个蜘蛛的最大公约数就不为1,否则这两只蜘蛛就不能直接联系。现在给你两个蜘蛛的序号i,j问这两只蜘蛛是否可以直接或者通过其他的蜘蛛产生联系?

思路:

因为每两只蜘蛛能够产生联系的条件是GCD()!=1,那么我们可以先预处理一下把

每一只蜘蛛所包含的质数存起来,然后存

每个质数包含那些蜘蛛

可以直接用试除法(时间有点卡),也可以用线性筛预处理然后遍历

因为他是问能否从i蜘蛛走向j蜘蛛,那么就是问能不能通过i bfs走到 j

那么可以从起点开始,定义两个状态数组st1(这个质数是否被走过),st2(这个人是否被走过)

然后从这个蜘蛛开始遍历他的质数,然后从质数开始遍历有多少人可以走,如果可以走而且没被走过就直接push,这样就是一个基本的bfs

但是题目要求要保存蜘蛛走的路径,那么我们可以定义一个数组k,然后在每次push的时候讲路径存起来:

比如

但是这样我们就会发现一个问题,就是a在bfs的时候k[a]会不断发生改变导致最后的k[a]并不是正确的那一个

比如上图:如果是a点走到c点,那么首先k[a]会是b,然后再向他的邻接点走到d就变成了k[a]=d,然后b点走到c,k[b]=c,程序结束,我们可以发现我们应该的序列应该是 a b c ,但是因为后面的bfs会导致我的k[a]是d,序列变成 a d c,为一个错误序列。

那么为了使序列变成正确的序列,我们可以从终点开始bfs,然后往起始点走,那么k应该如何赋值?

因为是从终点走向起始点:如C->B 那么按照从起点往终点走的话,应该就是k[b]=c;

这样子我们可以发现因为每个点都只会bfs一次,所以k[b]这个地方只会走一遍,那么他的值是不会改变的。如果找到了可以走的路,那么就可以根据k来寻找路径。

具体的就看代码吧!


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;

const int N = 500000 + 100;
int n, m, a, b;
ll s[N];
int p[N], k[N];
bool st[N], st1[N], st2[N];
vector<int> mp[N], pm[N];
int tim=0;
void shai()
{
    int n=3e5;
    st[1]=1;

    for(int i =2;i<=n;i++)
    {
        if(!st[i]) p[++tim]=i;
        for(int j =1;p[j]<=n/i;j++)
        {
            st[i*p[j]]=1;
            if(i%p[j]==0)break;
        }
    }
}


bool bfs()
{
    queue<pair<int, int>> qu;
    qu.push({b, 0});
    st1[b] = 1;
    while (qu.size())
    {
        pair<int, int> lk = qu.front();
        qu.pop();
        int c = lk.first, dis = lk.second;
        for (int i = 0; i < mp[c].size(); i++)
        {
            int kk = mp[c][i]; // 这个质数
            if (st2[kk])
                continue;
            for (int j = 0; j < pm[kk].size(); j++)
            {
                int tt = pm[kk][j]; // 这个人
                if (st1[tt])
                    continue;
                if (tt == a)
                {
                    cout << dis + 2 << endl;
                    //k[c] = b;
                    k[a]=c;
                    return 1;
                }
                //k[c] = tt;
                k[tt]=c;
                st2[kk] = 1, st1[tt] = 1;
                qu.push({tt, dis + 1});
            }
        }
    }
    return 0;
}

void solve()
{

    cin >> n;
    shai();
    for (int i = 1; i <= n; i++)
    {
        sc_ll(s[i]);

        for(int j =1;p[j]<=s[i]/p[j];j++)
        {
            if (s[i] % p[j] == 0)
            {
                while (s[i] % p[j] == 0) s[i] /= p[j];
                mp[i].push_back(p[j]); // 第i个人包含这个质数
                pm[p[j]].push_back(i); // 这个质数包含这个人
            }
        }
        if (s[i] > 1)
        {
            mp[i].push_back(s[i]); // 第i个人包含这个质数
            pm[s[i]].push_back(i); // 这个质数包含这个人
        }        
    }

    cin >> a >> b;
    if (a == b)
    {
        printf("1\n%d", a);
        return;
    }
    if (bfs())
    {
        printf("%d ", a);
        while (k[a] != b)
        {
            printf("%d ", k[a]);
            a = k[a];
        }
        printf("%d\n", b);
    }
    else
        printf("-1");

    return;
}

int main()
{
    solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SDK安全专项评测证书

SDK安全专项行动”是中国信息通信研究院安全研究所大数据应用与安全创新实验室共同发起的&#xff0c;实验室紧跟信息技术发展趋势&#xff0c;依托数据安全、移动安全等领域深厚积累&#xff0c;通过前瞻研究和实践探索&#xff0c;形成了完整的SDK评测方案和指标体系。 SDK产…

【HCIA-openEuler】实验手册—05【openEuler软件管理】

文章目录一、实验介绍1、内容描述2、实验目的二、配置Yum源步骤1&#xff1a;进入yum repo目录步骤2&#xff1a;更改openEuler_x86_64.repo文件步骤3&#xff1a;刷新列出软件列表三、使用RPM命令管理软件1、RPM查询命令步骤1&#xff1a;执行以下命令&#xff0c;通过yum和rp…

华为DHCP实验配置

配置AR1为PC2分配地址 dhcp enable ip pool DHCP_PC2 network 192.168.20.200 mask 24 gateway-list 192.168.20.254 dns-list 192.168.20.100 excluded-ip-address 192.168.20.100 int g0/0/1 ip address 192.168.20.254 24 dhcp select global 配置AR1为PC3分配IP地址 dhcp e…

一个令人赞不绝口的代码 Debug 神器

在编写程序时&#xff0c;无论是对于初学者还是对于专业开发人员&#xff0c;都会花费大量时间来调试或修复源代码错误&#xff0c;也就是 Debug。 这个过程繁琐复杂&#xff0c;包括 Bug 复现和 Bug 定位等环节。如果有了自动化的 Debug 程序&#xff0c;就可以显著提高编程实…

Three.js一学就会系列:05 加载3D模型

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 Three.js一学就会系列&#xff1a;03 炫酷3D划线 Three.js一学就会系列&#xff1a;04 炫酷3D文字 文章目录系列文章目录前言一、核心代码讲解引入插件轨道控制器加载…

ES6 课程概述⑤

文章目录9-1. Fetch Api 概述9-2. 基本使用参数返回值9-3 **Response 对象**9-4 Request 对象9-5 Headers 对象9-6 文件上传10-1 迭代器背景知识JS 中的迭代器可迭代协议 与 for-of 循环可迭代协议for-of 循环展开运算符与可迭代对象生成器 (Generator)set 集合9-1. Fetch Api …

Unity 之 Addressable可寻址系统 -- 代码加载介绍

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶&#xff08;一&#xff09;一&#xff0c;可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二&#xff0c;可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三&#xff0c;代码加载可寻址的解释概述…

算法第九期——DFS(深度优先搜索)的树上应用

树 树是一种特殊的图 。 特点&#xff1a; 若树有n个点,则有n-1条边。树有连通性但没有回路。从一个点出发可以到达任意一个&#xff0c;而且路径是唯一的。树的重心u&#xff08;最平衡的点&#xff09;: 以树上任意一个结点为根计算它的子树的结点数&#xff0c;如果结点…

二部图和匈牙利算法

1.二分图最大匹配 设G为二分图,若在G的子图M中,任意两条边都没有公共节点,那么称M为二分图G的一组匹配。在二分图中,包含边数最多的一组匹配称为二分图的最大匹配。 交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。 …

【算法】深度优先搜索 (DFS)

目录1.概述2.代码实现3.应用1.概述 &#xff08;1&#xff09;深度优先遍历 (Depth First Search, DFS)&#xff0c;是图的搜索算法之一&#xff0c;本质其实就是一个递归的过程&#xff0c;它就像是一棵树的前序遍历。 &#xff08;2&#xff09;DFS 从图中某个顶点 start 出…

游戏如何解决注入挂难题

游戏黑灰产的攻击角度除了常见的内存修改、模拟点击、破解等作弊手段&#xff0c;还有门槛相对较高的「专用插件类」。 专用插件类外挂是指针对特定游戏定制的外挂&#xff0c;其在实现方式上&#xff0c;类似插件&#xff0c;也称“定制挂”、“注入挂”。 游戏面临多样化的安…

招聘老师的最佳实践及工作交流坊

香港 — 如果你在招聘外籍老师途中遇到极大的挑战&#xff0c;你并不是孤独的。由于新冠肺炎的限制及对于外籍老师的需求增加&#xff0c;招聘及留住高质量的外籍老师对于学校来说已经越来越困难。在疫情之下&#xff0c; 许多学校展现了非凡的韧性来确保他们的教学质量及学习供…

【HCIA-openEuler】实验手册—04【openEuler用户及权限管理】

文章目录一、实验介绍1、关于本实验2、实验目的二、实验任务配置1、配置步骤&#xff08;1&#xff09;用户和用户组的管理步骤1&#xff1a;who命令是显示目前登录系统的用户信息步骤2&#xff1a;id命令用于显示用户的ID&#xff0c;以及所属群组的ID步骤3&#xff1a;以root…

Vivado 错误代码 [Place 30-574]解决思路

问题描述 最近利用手头的开发板作UDP通信的设计。准备生成比特流时&#xff0c;出现这个错误&#xff1a; 具体信息&#xff1a; [Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you …

Java(105):Java通过键盘(Scanner)输入数据

Java通过键盘(Scanner)输入数据 在Java中&#xff0c;我们可以使用Scanner 类来获取用户的输入。 Java 中添加了java.util.Scanner类&#xff0c;这是一个用于扫描输入文本的新的实用程序。相比于其他获取用户输入的方式&#xff0c;Scanner是非常方便的。 如果使用Scanner&…

如何理解鲁棒性?为什么robustness会翻译为鲁棒性?

鲁棒性&#xff0c;英文为Robustness&#xff08;承受故障和干扰的能力&#xff09;&#xff0c;是许多复杂系统&#xff08;包括复杂网络&#xff09;的关键属性。复杂网络的鲁棒性研究对许多领域都非常重要。本文着重介绍了鲁棒性的基本定义、命名起源、分类区别、提升方法和…

一图读懂mybatis插件plugin原理

插件是用来改变或者扩展mybatis的原有的功能&#xff0c;mybaits的插件就是通过继承Interceptor拦截器实现的;mybatis中能使用插件进行拦截的 可以进行拦截的 接口和方法如下: Executor (update、query 、 flushStatment 、 commit 、 rollback 、 getTransaction 、 close 、…

机试_1_暴力求解_习题

暴力求解——习题 学习完第一章–暴力求解之后&#xff0c;当然要做相应地练习啦~ https://blog.csdn.net/Window_mouse/article/details/128632426 注&#xff1a;上述习题都可以在牛客进行测试。 例如&#xff0c;第9题链接&#xff1a;xxx定律_牛客题霸_牛客网 (nowcode…

近几年美赛B题分析

美赛B题概述&#xff1a; 美赛赛题类型美国大学生数学建模竞赛目前分为两种类型&#xff0c;MCM&#xff08;Mathematical Contest In Modeling&#xff09;和 ICM&#xff08;Interdisciplinary Contest In Modeling)&#xff0c;两种类型竞赛采用统一标准进行&#xff0c;竞…

金融风控04

特征工程 Filter 1&#xff09;移除低方差特征 假设某特征的特征值只有0和1&#xff0c;并且在所有输入样本中&#xff0c;95%的实例的该特征取值都是1&#xff0c;那就可以认为这个特征作用不大。如果100%都是1&#xff0c;那这个特征就没意义了。当特征值都是离散型变量的…