博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2749 & hdu 1815 Building roads(2-SAT + 二分,好题)
阅读量:4073 次
发布时间:2019-05-25

本文共 1672 字,大约阅读时间需要 5 分钟。

【题目链接】

poj: 

hdu: 

【题目大意】

有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来。 为了使得任意牛棚两个都可以有道路联通,现在要让每个牛棚都连接一条路到S1或者S2。

有a对牛棚互相有仇恨,所以不能让他们的路连接到同一个中转站。还有b对牛棚互相喜欢,所以他们的路必须连到同一个中专站。

道路的长度是两点的曼哈顿距离。

问最小的任意两牛棚间的距离中的最大值是多少?

【思路】

两天前看了这题,当时没什么想法,今天又翻看了一下,想出来了。

每个牛棚有可以选择S1或者S2,并且有矛盾对,是2-SAT无疑。

首先这题要二分所求的距离是一定要的, 最大的问题是怎样建图?

我们枚举了任意牛棚之间的最大距离,说明如果有两个牛棚,他们选择的连接方式使得他们的距离大于最大距离,他们肯定就不能选择这种连接的,这是个矛盾对,根据这个可以加边了。

然后就是互相仇恨的和互相喜欢的建边,这个很容易想到。

写完后在poj提交,发现WA了,但是很肯定自己的算法没问题,就想到可能是二分的右边界太小了,于是改大成了400W,然后AC了。

于是又交到hdu去,结果竟然TLE了。。。搞了很久,发现还是右边界开小了,于是不断加大,最后到800W才AC了。右边界小了会TLE,这个让我想不通了,求指教

另外,每一点到S1和S2的距离预先算好,而不是每次建图时都算,这样可以省很多很多的时间

【代码】

#include
#include
#include
#include
#include
using namespace std;const int MAXN = 1005;const int VN = MAXN*2;const int EN = 1200000;int n, hateNum, likeNum;int d[VN], sLen;struct Node{ int x, y;}barn[MAXN], hate[VN], like[VN], s1, s2;struct Edge{ int v, next;};struct Graph{ int size, head[VN]; Edge E[EN]; void init(){ size=0; memset(head, -1, sizeof(head)); } void addEdge(int u, int v){ E[size].v = v; E[size].next = head[u]; head[u] = size++; }}g;class Two_Sat{public: bool check(const Graph& g, const int n){ scc(g, 2*n); for(int i=0; i
maxLen){ g.addEdge(i, j+n); g.addEdge(j, i+n); } if(l1 + r2 + sLen > maxLen){ g.addEdge(i, j); g.addEdge(j+n, i+n); } if(l2 + r1 + sLen > maxLen){ g.addEdge(i+n, j+n); g.addEdge(j, i); } if(l2 + r2 > maxLen){ g.addEdge(i+n, j); g.addEdge(j+n, i); } } for(int i=0; i
>1; buildGraph(mid); if(sat.check(g, n)){ ans = mid; r = mid-1; } else l = mid+1; } printf("%d\n", ans); } return 0;}

转载地址:http://xpzni.baihongyu.com/

你可能感兴趣的文章
permanently
查看>>
Unity2019游戏框架搭建第一季C# 核心知识与简易框架搭建 + Unity2019 游戏框架搭建第二季:UI 模块与资源模块持续精进...
查看>>
Unity发布到Google Play应用上架流程
查看>>
50 个 Chrome Developer Tools 必备技巧
查看>>
TextMesh Pro不能显示中文的解决办法是创建字贴图,常用汉字3500+特殊字符
查看>>
unity3d钢琴游戏完整项目源码
查看>>
Unity 2019 LTS正式推出
查看>>
关于UE4使用中虚幻商城保管库的目录问题
查看>>
Unity3D 2018版本 Post Process 后期处理插件使用介绍
查看>>
UE4户外森林场景全流程教学
查看>>
零基础入门Unity - 古迹探险(Unity2017)
查看>>
C#批量修改文件后缀名
查看>>
Unity3D普通开发人员,U3D主程分别需要掌握的技能
查看>>
关于XMLList = node["节点1"]["节点2"]中只有1个节点的问题
查看>>
readUnsignedInt () 自动移动字节流位置,和.net是一样的
查看>>
大型应用程序中的资源destory办法
查看>>
action,webaction,mode,controller
查看>>
多个单例模式单例模式的应用
查看>>
北山白云里,隐者自怡悦。
查看>>
mouseChildren= false
查看>>