poj 2296 Map Labeler(2-SAT+二分,构图)
来源:互联网 发布:netstat查看端口占用 编辑:程序博客网 时间:2024/04/20 13:00
http://poj.org/problem?id=2296
题意:
给你n个点,要你在这n个点上放一个正方形,点
只能在正方形的上边或下边的中点上,所有正方形大小一样,
不能重叠,求最大的正方形。。。
分析:
如果abs(s[i].x-s[j].x)>=r则可以随便放
如果 abs[s[i].x-s[j].y)< r;
如果abs(s[i].y-s[j].y)< r,如果s[i].y==s[i].y则要求一个放上面一个放下面。
否则只能是上面的点放上面,下面的点放下面。
如果r<=abs(s[i].y-s[j].y)< 2*r,则除了上面的点放下方、下面的点放上方的情况都是可以的。
using namespace std;const int N = 1000 + 10;vector<int> g[N];int pre[N], lowlink[N], sccno[N], dfs_clock, scc_cnt;stack<int> S;void dfs(int u) { pre[u] = lowlink[u] = ++dfs_clock; S.push(u); for(int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if(!pre[v]) { dfs(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else if(!sccno[v]) { lowlink[u] = min(lowlink[u], pre[v]); } } if(lowlink[u] == pre[u]) { ++scc_cnt; int x; do { x = S.top(); S.pop(); sccno[x] = scc_cnt; } while(x!=u); }}void find_scc(int n) { dfs_clock = scc_cnt = 0; memset(sccno, 0, sizeof(sccno)); memset(pre, 0, sizeof(pre)); for(int i = 0; i < n; i++) if(!pre[i]) dfs(i);}//2*i上面//2*i+1 下面int a[N],b[N],n;bool ok(int d) { //cout<<d<<endl; for(int i=0; i<=2*n; i++)g[i].clear(); for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) { if(abs(a[i]-a[j])>=d)continue; if(abs(b[i]-b[j])<d) { if(b[i]==b[j]) { //一个在上面一个在下面 g[2*i].push_back(2*j+1); g[2*j].push_back(2*i+1); g[2*i+1].push_back(2*j); g[2*j+1].push_back(2*i); } else if(b[i]>b[j]) { //i在上面 j在下面 g[2*i+1].push_back(2*i); g[2*j].push_back(2*j+1); } else { g[2*i].push_back(2*i+1); g[2*j+1].push_back(2*j); } } else if(abs(b[i]-b[j])<2*d) { if(b[i]>b[j]) { //i在下j在上不允许 g[2*i+1].push_back(2*j+1); g[2*j].push_back(2*i); } else { // g[2*j+1].push_back(2*i+1); g[2*i].push_back(2*j); } } } find_scc(n*2); for(int i=0; i<2*n; i++) if(sccno[i]==sccno[i^1]) { return 0; } return 1;}int main() { int T; // freopen("f.txt","r",stdin); scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d%d",&a[i],&b[i]); int l=0,r=100000; while(l<r) { int mid=l+(r-l+1)/2; if(ok(mid))l=mid; else r=mid-1; } printf("%d\n",l); } return 0;}
0 0
- poj 2296 Map Labeler(2-SAT+二分,构图)
- Map Labeler (poj 2296 二分+2-SAT)
- POJ 2296 Map Labeler 2-SAT 二分
- POJ 2296 Map Labeler(二分+2-SAT)
- |poj 2296|2-SAT|二分|Map Labeler
- POJ 2296 - Map Labeler 构图2-sat..注意细节...
- POJ 2296 Map Labeler ( 2-SAT判定 + 二分查找 )
- POJ 2296 Map Labeler(2-SAT+二分)
- POJ 2296 Map Labeler (二分+2-sat,4级)
- poj 2296 Map Labeler (2-sat +二分)
- POJ 2296 Map Labeler(2-sat)
- poj 2296 Map Labeler(二分+2-sat判定)
- POJ 2296 Map Labeler 2-SAT+二分答案
- POJ 2296 Map Labeler(二分边长+2-sat判解)(经典题)
- POJ 2296 Map Labeler(2-sat)
- POJ 2296 Map Labeler(2-SAT)
- 【POJ】2296 Map Labeler 2-sat
- poj 2296 Map Labeler 2-sat
- JSON-RPC轻量级远程调用协议介绍及使用
- 工作心得
- Calendar的用法
- StringBuffer与String的区别
- 对验证码进行灰度,二值化样本采集
- poj 2296 Map Labeler(2-SAT+二分,构图)
- 百度地图内网开发项目
- 201312_MySQL命令集合
- Centos 7 下安装 jdk rpm包
- pm命令介绍与包名信息查询--待完善
- [心得]面试经验谈
- java基于有序链表的优先级队列实现
- linux多核处理下提高编译速度 make -j
- Java中多线程的实现方式