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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ2296 Map Labeler【2-SAT】【二分】

题目大意: 制作地图是一件很复杂的工作,其中一项任务就是为地图上的城市制作标示——在地图上每个 城市的所在位置附近贴上一个文字标签。标签的一个要求就是亮亮不能重叠。本题中,假设每 个城市都是平面上的一...
  • u011676797
  • u011676797
  • 2015年02月21日 11:23
  • 856

POJ2296 Map Labeler

Map Labeler Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1659 Accepted: 540 Descrip...
  • eeeaaaaa
  • eeeaaaaa
  • 2014年08月20日 19:15
  • 227

poj 2296 Map Labeler(2-SAT+二分,构图)

http://poj.org/problem?id=2296 题意: 给你n个点,要你在这n个点上放一个正方形,点 只能在正方形的上边或下边的中点上,所有正方形大小一样, 不能重叠,...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年10月08日 18:22
  • 189

POJ 2296 Map Labeler(2-SAT+二分)

【题目链接】 http://poj.org/problem?id=2296 【题目大意】 坐标轴上有N个点,要在每个点上贴一个正方形,这个正方形的横竖边分别和x,y轴平行,并且要使得...
  • shuangde800
  • shuangde800
  • 2013年05月05日 22:25
  • 1401

poj Map Labeler 【2-sat + 二分】【最后一道2-sat 1A好开心】

Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1812   Accepted: 597 ...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年07月26日 22:03
  • 376

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

Description Map generation is a difficult task in cartography. A vital part of such task is automat...
  • kongming_acm
  • kongming_acm
  • 2011年10月19日 20:39
  • 688

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

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

POJ 2296 Map Labeler(二分+2-SAT)

水题吧。 #include #include #include #include #include using namespace std; const int maxn=100+5; struct...
  • qq_33901573
  • qq_33901573
  • 2016年11月16日 10:32
  • 78

POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler

POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat ...
  • songyuchen0001
  • songyuchen0001
  • 2017年07月01日 09:41
  • 182

|poj 2296|2-SAT|二分|Map Labeler

poj传送门/* poj 2296 二分+2-SAT 教训: 1、注意复杂情况的分类讨论 2、a...
  • Darost
  • Darost
  • 2017年04月08日 15:59
  • 190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2296 Map Labeler(2-sat+二分)
举报原因:
原因补充:

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