zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    3D Slicer 体系结构2
    3D Slicer 体系结构1
    3D Slicer FAQ-3
    3D Slicer FAQ-2
    3D Slicer FAQ-1
    3D Slicer 编译、调试、规范化的开发
    3D Slicer 开发者必晓ABC
    3D Slicer 模块管理(二)场景视图、体数据、体绘制
    3D Slicer 模块管理(一)颜色、DCM、数据、模型、注释
    3D Slicer 数据与帮助
  • 原文地址:https://www.cnblogs.com/lokiii/p/9649834.html
Copyright © 2011-2022 走看看