【BZOJ1997】Planar(2-sat)

本文介绍了BZOJ1997 Planar问题的解决方案,利用2-SAT算法处理平面图特性,通过边数缩减至O(n)级别,详细讲述了如何先提取环路,再进行连边缩点判断,最终实现无交叉连接的可行性验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【BZOJ1997】Planar(2-sat)

题面

BZOJ

题解

很久没做过\(2-sat\)
今天一见,很果断的就来切

这题不难呀
但是有个玄学问题:
平面图的性质:边数\(m\)的最大值为\(3n-6\)
然后就可以把边数减到\(O(n)\)级别。。。

现在好了
因为已经告诉你了一个环
那就先把环给抠出来
剩下的就相当于给你若干条边,
你可以从环里面连也可以从环外面连
判定是否可以没有交点

很熟悉的\(2-sat\)
连边缩点,判断一下可行性
搞定

一开始边开小了,身败名裂

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAXL 22222
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Line{int u,v;}E[MAXL];
struct edge{int v,next;}e[MAXL<<3];
int h[MAXL],cnt,tot;
inline void Add(int u,int v){e[cnt]=(edge){v,h[u]};h[u]=cnt++;}
int p[MAXL],S[MAXL],top,G[MAXL],gr;
int dfn[MAXL],low[MAXL],tim;
int n,m;
void init(int m)
{
    cnt=1;gr=tot=top=0;
    for(int i=1;i<=m+m;++i)dfn[i]=low[i]=G[i]=h[i]=0;
}
void Tarjan(int u,int ff)
{
    dfn[u]=low[u]=++tim;
    S[++top]=u;
    for(int i=h[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(v==ff)continue;
        if(!dfn[v])Tarjan(v,u),low[u]=min(low[u],low[v]);
        else low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        int v;++gr;
        do{v=S[top--];G[v]=gr;}while(u!=v);
    }
}
bool check()
{
    for(int i=1;i<=m;++i)if(G[i]==G[i+m])return false;
    return true;
}
int main()
{
    int T=read();
    while(T--)
    {
        n=read();m=read();
        for(int i=1;i<=m;++i)E[i].u=read(),E[i].v=read();
        for(int i=1;i<=n;++i)p[read()]=i;
        for(int i=1;i<=m;++i)E[i].u=p[E[i].u],E[i].v=p[E[i].v];
        if(m>3*n-6){puts("NO");continue;}
        init(m);
        for(int i=1;i<=m;++i)if(abs(E[i].u-E[i].v)!=1)E[++tot]=E[i];
        m=tot;
        for(int i=1;i<=m;++i)if(E[i].u>E[i].v)swap(E[i].u,E[i].v);
        for(int i=1;i<=m;++i)
            for(int j=1;j<=m;++j)
                if(E[i].u<E[j].u&&E[j].u<E[i].v&&E[i].v<E[j].v)
                    Add(i+m,j),Add(i,j+m),Add(j,i+m),Add(j+m,i);
        for(int i=1;i<=m+m;++i)if(!dfn[i])Tarjan(i,0);
        check()?puts("YES"):puts("NO");
    }
}

转载于:https://www.cnblogs.com/cjyyb/p/8436185.html

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 以下是关于西林电气EH600LC系列变频器说明书的要点概述: 这是一份针对使用EH600LC系列变频器的用户编写的中文说明书,主要目的是指导用户如何正确地安装、操作以及维护该系列变频器。 从说明书的部分内容来看,变频器的基本参数如下:输入电压为三相AC380V,频率为50Hz或60Hz;输出频率范围是0Hz至650Hz;以EH640LC型号为例,输入电流为5.0A,输出电流为3.7A;该系列变频器可能涵盖1.2kW至40kW的可变功率范围。 变频器的型号标识为EH600LC系列,包含多个不同规格的产品,以满足多样化的应用需求。产品序列号显示为“SHENZHENXILINELECTRICTECHNOLOGIESCO.,LTD.MADEINCHINA”,表明该产品由西林电气公司生产,产地是中国深圳。 在操作功能方面,变频器具备如“JOG”(点动运行)等多种操作功能,还可能有频率、电流、电压等参数的设定与调整功能,同时提供了模拟信号接口、数字信号接口等多种控制接口。控制接口有FD.10、FB.11等代码标识,例如FB.11=0或FB.11=1可能表示数字输入信号的不同状态。 变频器设有多个LED指示灯,比如LED、F4.00、F6.01等,用于指示工作状态,包括电源状态、运行状态、故障状态等,也可能有用于显示特定故障或警告的LED指示灯。频率调节范围可在0.01Hz到20.00Hz、50.00Hz、650.00Hz等不同区间灵活调整,设定频率时可设置0.1s、0.5s、1.0s等不同的加速和减速时间。 说明书还对变频器的输入输出接口进行了说明,X1、X2、X3等标记代表不同的接口端子,其中包含用于24V直流电源输入的端子E24VX4CM。变频器可能支持通过DI(数字输入)信号等外部控制信号进
标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值