[bzoj1997][2-sat]Planar

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

2

6 9

1 4

1 5

1 6

2 4

2 5

2 6

3 4

3 5

3 6

1 4 2 5 3 6

5 5

1 2

2 3

3 4

4 5

5 1

1 2 3 4 5

Sample Output

NO

YES

题解

第一次做有关平面图的问题
先记下一个结论:对于一个极大简单平面图G(n,m),总有m<=3*n-6
发现如果两条线段在圈内会相交,在圈外也会相交
暴力枚举两条线段判相交情况,建边2-sat判可行性
m很大但可以用上面那个结论剪枝
就愉快地n2n2

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct pt{int c,op;}g[15];
bool cmp(pt n1,pt n2){return (n1.c!=n2.c)?(n1.c<n2.c):(n1.op<n2.op);}
struct edge{int x,y;}w[10005];
struct node{int x,y,next;}a[400005];int len,last[1205];
void ins(int x,int y){len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;}
int low[1205],dfn[1205],sta[1205],belong[1205],id,cnt,tp,n,m;
bool v[1205];
void tarjan(int x)
{
    low[x]=dfn[x]=++id;sta[++tp]=x;
    v[x]=true;
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        if(dfn[y]==-1)tarjan(y),low[x]=min(low[x],low[y]);
        else if(v[y])low[x]=min(low[x],dfn[y]);
    }
    if(low[x]==dfn[x])
    {
        int i;cnt++;
        do
        {
            i=sta[tp--];
            belong[i]=cnt;
            v[i]=false;
        }while(i!=x);
    }
}
int ring[1205],pos[1205];
bool check(int x,int y)
{
    int u=pos[x];
    if(ring[u+1]!=y&&ring[u-1]!=y)return true;
    return false;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)scanf("%d%d",&w[i].x,&w[i].y);
        for(int i=1;i<=n;i++)scanf("%d",&ring[i]),pos[ring[i]]=i;
        ring[0]=ring[n];ring[n+1]=ring[1];
        if(m>3*n-6){puts("NO");continue;}
        len=0;memset(last,0,sizeof(last));
        for(int i=1;i<=m;i++)
            if(check(w[i].x,w[i].y))
                for(int j=i+1;j<=m;j++)
                    if(check(w[j].x,w[j].y))
                    {
                        int s1=pos[w[i].x],s2=pos[w[i].y];if(s1>s2)swap(s1,s2);
                        int s3=pos[w[j].x],s4=pos[w[j].y];if(s3>s4)swap(s3,s4);
                        if(s1==s3||s1==s4||s2==s3||s2==s4)continue;
                        g[1].c=s1;g[1].op=1;g[2].c=s2;g[2].op=1;
                        g[3].c=s3;g[3].op=2;g[4].c=s4;g[4].op=2;
                        sort(g+1,g+1+4,cmp);
                        if(g[1].op==g[3].op)ins(i,j+m),ins(i+m,j),ins(j,i+m),ins(j+m,i);
                    }
        memset(dfn,-1,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(v,false,sizeof(v));
        id=cnt=tp=0;
        for(int i=1;i<=2*m;i++)if(dfn[i]==-1)tarjan(i);
        bool bk=true;
        for(int i=1;i<=m;i++)if(belong[i]==belong[i+m]){bk=false;break;}
        if(bk)puts("YES");
        else puts("NO");
    }
    return 0;
}
先看效果: https://pan.quark.cn/s/c7070e7537b1 [!NOTE] 每到答辩季我就会喜获stars,谢谢大家的支持! 欢迎推广传播本repo(https://.com/atomiechen/THU-PPT-Theme),也欢迎贡献变体,提供更多选择 清华简约主题PPT模板 Repo stars 2020年春夏之交,答辩期间很多同学都在寻找清华主题的答辩模板。 一方面有使用LaTeX制作Beamer的模板(见Overleaf上的模板THU Beamer Theme),另一方面民间也存在着一些PPT模板。 很多人可能不适应Beamer的使用(主要是内容和排版设计不是可见即所得,定制有门槛),以及我找到的PPT模板也都不太好使(要么图案设计太复杂、不好看,要么没有制作成PPT母版导致每次使用都要复制粘贴+微调,不方便)。 我制作了清华简约主题的PPT模板,后续有新的设计我会逐渐加入,也欢迎有兴趣有想法的朋友们添砖加瓦! 内容 所有模板均为 文件。 此外也提供转换脚本用于 Pandoc自动生成PPTX。 各个版本的修改历史见 CHANGELOG.md。 下载 推荐直接从 Releases 下载最新发布版。 也可以在 仓库 单独下载所需文件。 效果 16:9比例,v1留边、v1顶边、v3留边白底、v3顶边白底: demo 16:9比例,其他风格模板:v1扁平、v2扁平、v1暗光 demo2 其他变体设计参见 variants/README.md。 使用方式 可以基于所提供的文件自行修改内容,也可以在新建的PPT文稿中应用该模板。 后者在 MS Office 2019 For Mac 的 PowerPoint 里的具体使用方式为:首先选择幻灯片尺...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值