poj2296 Map Labeler(2-sat+二分)

原创 2016年08月30日 15:57:36

由于每个点要么在label的顶边或者在label的底边且在中间,并且有且只有一个在label上,所以就可以转化为2-sat问题。
建图如下:
不妨设 点yi<=yj。(i表示向下,!i表示向上)
if(|xi-xj|>=d) continue;
if(yj-yi>=2*d) continue;
if(yj-ji>=d) i||!j
else if(yj-ji>0) i&&!j
else if(yj==yi) (i&&!j)||(j&&!i)即(!j||!i)&&(j||i)

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <stack>
#include <vector>
#include <string.h>
#include <queue>
#define mabs(X) ((X)>0?(X):(-(X)))
#define msc(X) memset(X,-1,sizeof(X))
#define ms(X) memset(X,0,sizeof(X))
typedef long long LL;
using namespace std;
int m;
struct _Point
{
    int x,y;
}point[110];
int cmp(const void *a,const void *b)
{return ((struct _Point *)a)->y-((struct _Point *)b)->y;}
struct _Edge
{
    int to,next;
}edge[205*205];
int hd[205],tot;
void addedge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].next=hd[u];
    hd[u]=tot++;
}
void inti(int d)
{
    tot=0;
    msc(hd);
    for(int i=0;i<m;i++)
        for(int j=i+1;j<m;j++)
        {
            if(mabs(point[i].x-point[j].x)>=d)
                continue;
            if(point[j].y-point[i].y>=2*d)
                continue;
            if(point[j].y-point[i].y>=d)
            {//  i||!j
                addedge(i<<1,j<<1);
                addedge(j<<1|1,i<<1|1);
            }
            else if(point[j].y-point[i].y>0)
            {//  i&&!j
                addedge(i<<1,i<<1|1);
                addedge(j<<1|1,j<<1);
            }
            else if(point[i].y==point[j].y)//注意
            {// (i&&!j)||(!i&&j)
                addedge(j<<1|1,i<<1);
                addedge(i<<1|1,j<<1);
                addedge(i<<1,j<<1|1);
                addedge(j<<1,i<<1|1);
            }
        }
}
int Low[205],DFN[205],Stack[205],Belong[205];
int Index,top;
int scc;
bool Instack[205];
void Tarjan(int u)
{
    int v;
    Low[u]=DFN[u]=++Index;
    Stack[top++]=u;
    Instack[u]=true;
    for(int i=hd[u];i!=-1;i=edge[i].next)
    {
        v=edge[i].to;
        if(!DFN[v]){
            Tarjan(v);
            if(Low[u]>Low[v]) Low[u]=Low[v];
        }
        else if(Instack[v]&&Low[u]>DFN[v])
            Low[u]=DFN[v];
    }
    if(Low[u]==DFN[u]){
        scc++;
        do{
            v=Stack[--top];
            Belong[v]=scc;
            Instack[v]=false;
        }while(u!=v);
    }
}
bool judge(int d)
{
    inti(d);
    ms(DFN);
    ms(Instack);
    Index=scc=top=0;
    for(int i=0;i<2*m;i++)
        if(!DFN[i]) Tarjan(i);
    for(int i=0;i<m;i++)
        if(Belong[i<<1]==Belong[i<<1|1])
            return false;
    return true;
}
int main(int argc, char const *argv[])
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&m);
        for(int i=0;i<m;i++)
            scanf("%d %d",&point[i].x,&point[i].y);
        qsort(point,m,sizeof(struct _Point),cmp);
        int l=1,r=20005;
        while(l<r){
            int mid=(l+r)>>1;
            if(!judge(mid)) r=mid;
            else if(judge(mid+1)) l=mid+1;
            else {
                printf("%d\n",mid );
                break;
            }
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj 2296 Map Labeler(二分+2-sat判定)

Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1018   Ac...
  • fp_hzq
  • fp_hzq
  • 2012-10-03 21:14
  • 1017

POJ 2296 Map Labeler 2-SAT 二分

有n个点,只能位于某个正方形的上或下边的中点上,所有正方形边长相等且不重叠,求最大边长。 二分答案。 如果某两个点的x坐标不小于边长就无所谓。 如果小于,就得考虑在上面下面的问题。 如果y坐标...

poj 2296 Map Labeler 2-SAT+二分答案

Description Map generation is a difficult task in cartography. A vital part of such task is automat...

POJ 2296 Map Labeler 2-SAT+二分答案

这是我的第一篇博文,OI省选翻车几乎爆零,于是从OI狗变成了ACMer 听前辈说多写题解、模板、心得丢博客里会有明显的进步,于是决定开始这么做了。 想着第一篇是要写题解还是要写模板,想了想还是写题解。...

poj 2296 Map Labeler 2-sat

2-sat例题

【POJ】2296 Map Labeler 2-sat

传送门:【POJ】2296 Map Labeler 题目分析: wo men

poj 2296 Map Labeler【二分+2-set】【经典】

题目:poj 2296 Map Labeler题意:给出以下二维坐标点,然后让你往平面上放正方形,点必须落在正方形上面边的中点或者下面边的中点,正方形不能重叠,可以共用边。问最大正方形边的边长。分析:...

POJ 2296 Map Labeler 2-sat + 矩阵相交

题目:http://poj.org/problem?id=2296题意:有n个点,要用n个正方形标签贴住n个点,要求点必须在标签的上边或下边的中点,且标签不能相互覆盖,问标签的最大边长为多少思路:枚举...

POJ 2296 Map Labeler

POJ 2296 Map LabelerDescriptionMap generation is a difficult task in cartography. A vital part of su...

poj 2296 (2—SAT+二分)

继续2—SAT+二分,,n个正方形,每个点在正方形上边或下边的终点,每个点就有两种选择,2—SAT建图,, 此题有两种建图的方式: 一:分四种情况;i向上,j向上,判断两正方形是否相交,如果相交建边i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)