【ZOJ 4097】Rescue the Princess(边双连通分量+lca)

该数据集收录了国内主要期货商品和股指指数的日频行情 商品期货覆盖有色、黑色、能化、农产品等板块,包含铜、螺纹钢、原油、豆粕等活跃合约 股指指数部分涵盖沪深300、上证50、中证500等品种 每个品种提 该数据集收录了国内主要期货商品和股指指数的日频行情。商品期货覆盖有色、黑色、能化、农产品等板块,包含铜、螺纹钢、原油、豆粕等活跃合约。股指指数部分涵盖沪深300、上证50、中证500等品种。每个品种提供统一字段:合约代码、交易日期、开盘价、最高价、最低价、收盘价、结算价、成交量和持仓量。数据按交易日顺次排列,未做复权处理,直接反映交易所原始发布信息。 数据源:CMES金融数据库 立即下载

题目链接from The 19th Zhejiang University Programming Contest Sponsored by TuSimple
题目大意是给出一个无向图,每次询问给出三个点z,x,y,问是否存在x到z的路径和y到z的路的边不重合,如果是yes否则no。
**思路:**其实这题我看完就有思路,而且很正确,但是不知道为什么比赛的时候一直T,这个很显然和边双连通分量有关。在这个分量里,任意两点的可达且存在两种不同的路径,那么我们首先要求的是图的桥,那么我们把边双连通分量缩点,用桥来建树,但是题目没说是连通图,所以可能存在森林。这个用并查集判断一下就行。
那么实际上问题就转化成判断在树上 z ′ z' z′是否在 x ′ x' x′到 y ′ y' y′的路径上。这里就用lca来判断。比赛的时候就是这么做的,一直t,以为存在比lca效率更高的判断方法。。。但是就t。。。之前用的倍增的lca,这次用了树剖的实现的lca,然后就过了。。。
代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define ll long long
#define maxn 100005
#define maxx 200005
#define INF 0x7f7f7f7f
using namespace std;
int n,m,q;
int head[maxn],to[maxx<<1],_next[maxx<<1];
int edge=1;
int bridge[maxx<<1];
inline void addEdge(int x,int y)
{
    to[++edge]=y,_next[edge]=head[x],head[x]=edge;
    to[++edge]=x,_next[edge]=head[y],head[y]=edge;
}

int pre[maxn];
inline int _find(int x)
{
    return pre[x]==x?x:pre[x]=_find(pre[x]);
}

int dfn[maxn],low[maxn];
int ind=0;
void tarjan(int u,int _edge)
{
    dfn[u]=low[u]=++ind;
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        if(!dfn[v])
        {
            tarjan(v,i);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])bridge[i]=bridge[i^1]=true;
        }
        else if(i!=(_edge^1))low[u]=min(low[u],dfn[v]);
    }
}
int tot;
int be[maxn];
void color(int u)
{
    be[u]=tot;
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        if(bridge[i]||be[v])continue;
        color(v);
    }
}
vector<int> g[maxn];
void build()
{
    for(int i=1;i<=tot;i++)g[i].clear();
    for(int i=2;i<=edge;i++)
    {
        if(bridge[i])
        {
            int u=to[i];
            int v=to[i^1];
            g[be[u]].push_back(be[v]);
            g[be[v]].push_back(be[u]);
            i++;
        }
    }
}

int deep[maxn],son[maxn],sz[maxn],fa[maxn];
void dfs(int u,int last)
{
    sz[u]=1;
    son[u]=0;
    int maxson=-1;
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i];
        if(v==last)continue;
        deep[v]=deep[u]+1;
        fa[v]=u;
        dfs(v,u);
        sz[u]+=sz[v];
        if(maxson<sz[v])
        {
            maxson=sz[v];
            son[u]=v;
        }
    }
}

int top[maxn];
void dfs(int u,int last,int f)
{
    top[u]=f;
    if(son[u])
    {
        dfs(son[u],u,f);
        for(int i=0;i<g[u].size();i++)
        {
            int v=g[u][i];
            if(v==son[u]||v==last)continue;
            dfs(v,u,v);
        }
    }
}
int lca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(deep[top[x]]>deep[top[y]])x=fa[top[x]];
        else y=fa[top[y]];
    }
    return deep[x]>deep[y]?y:x;
}
void init()
{
    memset(head,0,sizeof(head));
    edge=1;
    ind=0;
    memset(dfn,0,sizeof(dfn));
    memset(bridge,false,sizeof(bridge));
    memset(be,0,sizeof(be));
    tot=0;
}
int main()
{
    int t;cin>>t;
    int x,y,z;
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)pre[i]=i;
        init();
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            addEdge(x,y);
            int xx=_find(x);
            int yy=_find(y);
            if(xx!=yy)pre[xx]=yy;
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])tarjan(i,-1);

        for(int i=1;i<=n;i++)
        {
            if(!be[i])
            {
                tot++;
                color(i);
            }
        }
        build();
        for(int i=1;i<=n;i++)
        {
            if(pre[i]==i)
            {
                deep[be[i]]=1;
                fa[be[i]]=0;
                dfs(be[i],0);
                dfs(be[i],0,be[i]);
            }
        }
        while(q--)
        {
            scanf("%d%d%d",&z,&x,&y);
            if(_find(x)==_find(y)&&_find(y)==_find(z))
            {
                x=be[x],y=be[y],z=be[z];
                if(x==z||y==z)
                {
                    printf("Yes\n");
                    continue;
                }
                if(x==y&&y!=z)
                {
                    printf("No\n");
                    continue;
                }
                if(deep[x]<deep[y])swap(x,y);
                if(lca(x,z)==z&&lca(z,y)==y)
                {
                    printf("Yes\n");
                    continue;
                }
                int g=lca(x,y);
                if(lca(g,z)==g&&(lca(x,z)==z||lca(y,z)==z))
                {
                    printf("Yes\n");
                    continue;
                }
                printf("No\n");
            }
            else printf("No\n");
        }
    }
    return 0;
}

OpenClaw与Ollama本地AI部署指南 AI模型本地化部署是当前企业数字化转型的关键技术,通过开源框架Ollama可以在消费级硬件上运行大语言模型。本文以OpenClaw多智能体系统为例,详解从环境配置到模型优化的全流程实践,特别针对国内开发者遇到的网络问题提供了镜像加速等解决方案。这种私有化部署方案尤其适合金融数据分析、企业知识管理等对数据安全要求高的场景,通过模块化设计实现多智能体协作,同时保持对NVIDIA显卡和普通CPU的兼容性。 阅读详情

相关推荐

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

ZOJ 4097 Rescue the Princess(tarjan判桥+LCA)(level 3)

题目链接 题意: 给你一个无向图,n个点,m条边,图中可能存在重边,自环 然后有q个询问(n<=1e5,m<=2e5,q<=1e5) 每一次询问u,v,w,问你能不能找到两条路径v->u,w->u 使得两条路径中没有公共的边 有->Yes,无->No 解析: 其实这道题tarjan判桥的特征挺明显的——无向图,重边,自环 然后你画一下样例...

咸鱼有梦想 274

Wio-LR1121多频段LoRa模块技术解析与应用实践

LoRa技术作为低功耗广域物联网(LPWAN)的核心通信方案,通过独特的扩频调制技术实现远距离传输与强抗干扰能力。其工作原理基于CSS(Chirp Spread Spectrum)调制,支持动态调整扩频因子(SF)和带宽(BW)来平衡传输距离与数据速率。Wio-LR1121模块作为Semtech LR1121芯片的载体,创新性地整合了sub-GHz、S-Band和2.4GHz多频段支持,配合仅1.35μA的睡眠电流,为跨境物联网部署提供了硬件基础。在智慧农业、工业监测等场景中,开发者可通过SPI接口快速集成

weixin_33742618的博客 416

ZOJ 4097 Rescue the Princess(边双连通分量缩点 + LCA)

大致题意:给你一个可以有重边和自环的n个点m条边的无向图,给你q个询问。每个询问告诉你公主的位置和两个骑士的位置。现在骑士要去救公主,问是否存在从两个骑士出发点到公主的边不相交路径。 我已经标出来了,是边不相交,而不是点不相交。然后这是一个无向图,所以我们容易想到的第一件事情就是要进行缩点。关于缩点,这里用到的是边双连通分量的定义,至于点双连通分量、边双连通分量和连通分量的区...

alpc_qleonardo 485

2025红队实战:Win11环境下ZAP、CobaltStrike与免杀套件深度评测

在网络安全领域,渗透测试与红队行动是评估系统防御能力的关键手段。其核心原理在于模拟真实攻击者的技术与流程,以发现潜在的安全漏洞。这项技术的价值在于主动识别风险,提升整体安全防护水平,广泛应用于企业安全评估、漏洞挖掘和攻防演练等场景。随着Windows 11系统普及,其增强的安全机制(如内存完整性、基于虚拟化的安全)对传统攻击工具链提出了新的挑战。本文聚焦于**CobaltStrike二开版**与**免杀套件**在Win11环境下的实战应用与深度对抗,探讨如何优化工具链以应对现代端点检测与响应(EDR)和高级

weixin_29315091的博客 309

别再傻傻分不清了!Anaconda和Miniconda到底选哪个?附保姆级安装与镜像源配置(Windows/Mac)

本文详细解析了Anaconda和Miniconda的核心差异,包括体积、预装内容、系统资源占用等关键维度,并提供了针对不同需求的决策框架。附有Windows和Mac双平台的详细安装与配置指南,帮助用户根据实际需求选择最适合的conda工具,提升开发效率。

weixin_30315723的博客 426

ZOJ-4097 Rescue the Princess(Tarjan边双连通缩点 + LCA)

题目链接 题目大意: 给你一个图(不保证连通,可能存在重边),多次查询,一次查询给出三个点u,v,w,(可能会重合),求有没有两条路径使得v到达u,w到达u,且这两条路径不重合。 点的数量 和 查询次数都是1e5级别。 题解: 先对原图进行边双连通缩点,判断的时候分为以下情况: 1.三个点都在同一个边双连通里,那么肯定存在这样两条不相交路径,想一下边双连通分量的性质就明白了 2.两个起点v,w在同...

积极的防守者的博客 340

Klocwork安装

简单介绍一下Klocwork在windows下的安装,操作系统是win7,Klocwork的版本是10.0。 第一步:由于Klocwork的安装程序已十分成熟,所以在安装之前不需要什么准备共走。双击Klocwork的安装包,会出现下图的安装引导界面,点击Next按钮。 第二步:下图是协议界面,点击Next按钮。 第三步:选择Klocwork的安装目录,点击Next按钮 第四步:

旮旯 9931

ZOJ 4097 Rescue the Princess(tarjan缩点 + LCA)

ZOJ 4097 Rescue the Princess 题意:给定一个无向图,要求回答q个询问。每个询问有三个参数:目标节点d和两个起点u,v。问是否存在分别从u,v出发至d的两条不相交的路径。不相交即两条路径不包含同一条边。 解题思路:先用tarjan缩点将图转化成树,再重新建图,最后通过LCA完成询问的判断。 ​ 注意无向图可能含有多个联通块,所以还需要dfs跑一遍联动块 AC代码: #i...

_Backl1ght 307

深度学习赋能胶囊内镜:AI如何实现胃肠道出血的自动检测与分割

在计算机视觉领域,图像分类与目标检测是处理医学影像分析的核心技术。其原理在于通过卷积神经网络(CNN)自动学习图像中的多层次特征表示,实现对特定目标的识别与定位。这项技术的价值在于能够将医生从海量、重复的阅片工作中解放出来,提升诊断效率与一致性,尤其在处理如胶囊内镜产生的数万张连续图像时优势显著。其应用场景广泛覆盖了医学影像的辅助诊断,例如在消化内科,对胃肠道出血的早期发现与精准定位具有重要临床意义。本文聚焦于利用深度学习模型,如U-Net和EfficientNet,构建一个能够从复杂多变的胶囊内镜图像中,

weixin_42533910的博客 382

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

ZOJ 4097 Rescue the Princess

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5986 题意 nnn个点,mmm条边的图,询问z,x,yz,x,yz,x,y,是否能找到xxx到zzz,yyy到zzz没有重复经过路的方案。 题解 边双联通,进行缩点,然后用LCA判断。 代码 #include<bits/stdc++.h> #define...

Spy97的博客 390

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

zoj 4097 Rescue the Princess (缩点+LCA)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4097 题意 在一个无向图中,询问u,v,w, v和w是否存在边不相同的路径到u。 题解 点双连通分量:任意两点之间存在两条点互不相同的路径。 边双连通分量:任意两点之间存在两条边互不相同的路径。 点双连通分量也是边双连通分量。 但边双连通分量不是点双连通分量。 一般这种题都...

Link_Ray的博客 415

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【ZOJ 4097 & The 19th Zhejiang University Programming Contest H】Rescue the Princess【边双连通缩点+LCA】

题意: 给出一个无向图,nnn个点,mmm条边,可能有重边与自环,也可能不连通。qqq 组询问,每组询问给出333个点,uuu、vvv、www,问是否存在两条路径不存在公共边,并且一条路径是v→uv\rightarrow uv→u,另一条路径是w→uw\rightarrow uw→u,存在输出YesYesYes,否则输出NoNoNo. (1≤n≤105,0≤m≤2∗105,1≤q≤105)(1\l...

lucius-liu.cn 628

【ZOJ 4097-Rescue the Princess】无向图tarjan缩点+LCA

链接 ZOJ 4097-Rescue the Princess 题意 给你一个无向图(不一定联通),有q次查询,每次查询给出三个点u,v,w,问v和w是否可以到达u而且不经过相同的边。 做法 首先我们把整个无向图进行缩点,可以得到一棵森林,如果答案合法,那么u,v,w肯定要在一棵树上,而且v和w的LCA一定是u,但是这里要注意这时无根树,所以要加一些判断,对所有不合法情况判断即可。 代码 #inc...

lajiyuan的博客 1002

【LCA+tarjan缩点+无向图含重边缩点板子】ZOJ Problem Set - 4097 Rescue the Princessing

Rescue the Princess Time Limit:1 Second Memory Limit:65536 KB Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Heltion Kingdom to rescue her. He...

qq_41037114的博客 305

【tarjan缩点+LCA】ZOJ - 4097 - Rescue the Princess

题目链接<http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5986> 题意: 给出一张图,两个起点和一个终点,问是否存在两条不相交的路。 题解: 先来个并查集,判断是否在一个连通块内。 再缩个点,如果都在一个点内,那么一定可以。 否则就是棵树,lca分类讨论一下。 赛上居然数组开小,疯狂自闭.. #...

Eliot的博客 235

ZOJ-4097 Rescue the Princess (e-DCC缩边+LCA)

题解 题意是给定一个1e51e51e5的无向图(可自环可重边且联通度不为1),1e51e51e5次询问 问是否存在两条没有公共边的路使得vvv到uuu,www到uuu成立 第一容易想到的点是边缩。边缩后满足同一节点中的222个点必定有222条路可达到 之后通过这性质可以发现假如uuu与v、wv、wv、w任意一个在同一节点答案必定是YesYesYes 对于其他情况,我们又可以发现当求出这333个点相...

TelmaZzzz的博客 259

zoj4097边双联通分量缩点dfs序判断

传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4097 从4月份打浙大校赛到这两天对着代码肉眼查错很久还出各种数据调试才该出来,原来还是原来的dfs序判断有问题,当时考场上写的dfs序就是由问题的,还好今天改出来了,不然就要妥协写lca了,其实lca也挺好写的,但我一直坚信dfs序判断巨对所以想把这题调出来。。。...

binarycopycode 240

poj3694

求双连通分量,利用并查集缩点,形成一棵树,树边肯定都是桥,然后每对点x,y,找原图中x,y点对应的新图中的点,如果不是一个点,则向上找它们的LCA,因为它们之间连了一条边,所以这些点到它们的LCA之间的边都不是割边了,找LCA时,先将两点上升到同一层次,然后一起再向上找父亲节点,其间遇到桥就把桥的标记删除,并且答案减1。 这个题比上一个好玩多了。 #include using namesp

Daze 2753

ZOJ3378:Attack the NEET Princess (边双连通分量)

Houraisan Kaguya (蓬萊山輝夜) is the NEET (not in education, employment or training) princess living in Eientei (永遠亭). She is an unemployed geek, who sits at home and surfs the Internet all day. But today ...

junior19的博客 381

ZOJ 4093 Robot Cleaner II (构造)

ZOJ 4093 Robot Cleaner II 前提:ZOJ 4092 Robot Cleaner I 题意:根据上一题给定的移动方法,要求设计一个超级程序,即给出机器人的指令集,使机器人能够至少能够捡起95%的垃圾。 解题方法:由于取那个位置的指令是根据当前位置及上下左右共5个位置的状态哈希运算出来了,我们可以根据哈希值来确定该位置的策略。 设哈希值为H,当H的最高位为2时,代表当前位置有垃...

_Backl1ght 427

ZOJ - 4097 Rescue the Princess (边双联通缩点无向图+思维lca)

Rescue the Princess Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to H...

柳予欣的三味书屋~ 359

ZOJ浙大校赛_problem H:Rescue the Princess(图论分析+tarjan边连通分量染色缩点+树上LCA+并查集)

题目大意:给出一个无向图(不一定连通),然后给出u,v,w三个点,v 和 w要去u,问是否存在两条路径使得v去u和w去u的路径上不存在任何一条公共边(换句话说一条边只能走一次,问u和v能不能都走到w); 可恶啊,想到了正确的图论模型,可惜只差一点,止步在最后的判断,剩一个小时的时候认为判断太复杂了放弃了(白调了一个小时的代码)。 刚看到可能有点懵,但是一想到怎样才会经过一条边?如果有v,w各自在的...

qq_41997978的博客 343
上一篇: 【HDU - 2586】How far away ? (树链剖分实现的LCA)
下一篇: 【POJ - 2774】Long Long Message(后缀数组)
coldfresh
博客等级 码龄10年 107粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值