1997: [Hnoi2010]Planar 2-SAT

本文介绍了一种使用2-SAT算法解决边矛盾问题的方法,并通过具体实现代码展示了如何利用图论中的二分图染色思想来求解。文章提供了一个完整的C++程序示例,用于检测边之间的冲突并判断是否存在可行的解决方案。

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

时隔几日再回来做这个题,开始用二分图染色A掉了。
看起来建图与那个恰恰相反,恩。
若边i和边j矛盾,那么我们要连边:
i->j’,i’->j,j->i’,j’->i。
又是一道裸的2-SAT,依旧不用输出方案QAQ。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int u[10005],v[10005],head[2005],pos[2005],dfn[2005],low[2005],belong[2005],stack[2005];
int n,m,tot,sum,cnt,top,scc,flag,Case;
int next[1000005],list[1000005];
bool inset[2005];
inline int read()
{
    int a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
inline void insert(int x,int y)
{
    next[++cnt]=head[x];
    head[x]=cnt;
    list[cnt]=y;
}
void dfs(int x)
{
    low[x]=dfn[x]=++sum;
    stack[++top]=x;
    inset[x]=1;
    for (int i=head[x];i;i=next[i])
        if (!dfn[list[i]])
        {
            dfs(list[i]);
            low[x]=min(low[x],low[list[i]]);
        }
        else if (inset[list[i]]) low[x]=min(low[x],dfn[list[i]]);
    if (low[x]==dfn[x])
    {
        int i=-1; scc++;
        while (i!=x)
        {
            i=stack[top--];
            belong[i]=scc;
            inset[i]=0;
        }
    }
}
inline void tarjan()
{
    for (int i=1;i<=2*tot;i++) if (!dfn[i]) dfs(i);
}
int main()
{
    Case=read();
    while (Case--)
    {
        memset(head,0,sizeof(head));
        memset(dfn,0,sizeof(dfn));
        flag=tot=sum=top=cnt=scc=0;
        n=read(); m=read();
        for (int i=1;i<=m;i++) u[i]=read(),v[i]=read();
        for (int i=1,x;i<=n;i++) x=read(),pos[x]=i;
        if (m>3*n-6) {puts("NO"); continue;}
        for (int i=1;i<=m;i++)
        {
            u[i]=pos[u[i]]; v[i]=pos[v[i]];
            if (u[i]>v[i]) swap(u[i],v[i]);
            if (v[i]-u[i]==1||v[i]-u[i]==n-1) continue;
            u[++tot]=u[i]; v[tot]=v[i];
        }
        for (int i=1;i<=tot;i++)
            for (int j=i+1;j<=tot;j++)
                if ((u[i]<u[j]&&u[j]<v[i]&&v[i]<v[j])||(u[j]<u[i]&&u[i]<v[j]&&v[j]<v[i]))
                    insert(2*i-1,2*j),insert(2*j-1,2*i),insert(2*i,2*j-1),insert(2*j,2*i-1);
        tarjan();
        for (int i=1;i<=tot;i++)
            if (belong[2*i-1]==belong[2*i]) {flag=1; break;}
        flag?puts("NO"):puts("YES");
    }
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值