bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】

脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠
考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2-SAT?)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int T,n,m,q[N],a[205][205],cnt,h[N],c[N],u[N],v[N],rk[N];
bool f;
struct qwe
{
    int ne,to;
}e[N<<1];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>'9'||p<'0')
    {
        if(p=='-')
            f=-1;
        p=getchar();
    }
    while(p>='0'&&p<='9')
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{//cout<<u<<" "<<v<<endl;
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
void dfs(int u,int col)
{
    if(!f)
        return;
    c[u]=col;
    for(int i=h[u];i;i=e[i].ne)
    {
        if(c[e[i].to]>0&&c[e[i].to]!=col^1)
        {
            f=0;
            return;
        }
        if(!c[e[i].to])
            dfs(e[i].to,col^1);
    }
}
int main()
{
    T=read();
    while(T--)
    {
        memset(a,0,sizeof(a));
        memset(c,0,sizeof(c));
        memset(h,0,sizeof(h));
        cnt=0;f=1;
        n=read(),m=read();
        for(int i=1;i<=m;i++)
            u[i]=read(),v[i]=read();
        for(int i=1;i<=n;i++)
            q[i]=read(),rk[q[i]]=i;
        if(m>3*n-6)
        {
            puts("NO");
            continue;
        }
        q[0]=q[n];
        for(int i=1;i<=n;i++)
            a[q[i-1]][q[i]]=a[q[i]][q[i-1]]=1;
        for(int i=1;i<=m;i++)
            if(rk[u[i]]>rk[v[i]])
                swap(u[i],v[i]);
        for(int i=1;i<=m;i++)
            if(!a[u[i]][v[i]])
                for(int j=i+1;j<=m;j++)
                    if(!a[u[j]][v[j]]&&((rk[u[i]]>rk[u[j]]&&rk[v[i]]>rk[v[j]]&&rk[u[i]]<rk[v[j]])||(rk[u[i]]<rk[u[j]]&&rk[v[i]]<rk[v[j]]&&rk[u[j]]<rk[v[i]])))
                        add(i,j),add(j,i);
        for(int i=1;i<=m;i++)
            if(!c[i])
                dfs(i,2);
        if(f)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lokiii/p/9649834.html
今日推荐