洛谷P3209 [HNOI2010]PLANAR
首先用一波神奇的操作,平面图边数m<=3*n-6,直接把m降到n,
然后对于冲突的边一条环内,一条环外,可以用并查集或者2Sat做,
当然并查集是无向的,2Sat是有向的,显然用并查集比较好 复杂度大概是O(T*n*n)
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define pb push_back
#define pii pair<int,int>
#define ft first
#define sc second
#define MAXN 200000+10
using namespace std;
int n,m;
int b[MAXN],d[MAXN],f[MAXN];
pii E[MAXN];
int find(int x){return (f[x]==x?x:f[x]=find(f[x]));}
void init_find(){
for(int i=;i<=(m<<);i++)f[i]=i;
}
void lik(int x,int y){
x=find(x),y=find(y);
if(x!=y)f[x]=y;
}
int solve(){
scanf("%d%d",&n,&m);
init_find();
for(int i=;i<=m;i++)scanf("%d%d",&E[i].ft,&E[i].sc);
int t;
for(int i=;i<=n;i++)scanf("%d",&t),d[t]=i;
if(m>*n-)return ;
memset(b,,sizeof(b));
for(int i=;i<=m;i++){
E[i].ft=d[E[i].ft],E[i].sc=d[E[i].sc];
if(E[i].ft>E[i].sc){swap(E[i].ft,E[i].sc);}
if(E[i].sc-E[i].ft==||E[i].sc-E[i].ft==n-)b[i]=;
}
pii x,y;
for(int i=;i<=m;i++){
if(b[i])continue;
for(int j=i+;j<=m;j++){
if(b[j])continue;
x=E[i],y=E[j];
if(x.ft==y.ft||x.ft==y.sc)continue;
if(x.sc==y.ft||x.sc==y.sc)continue;
if(x.ft==x.sc||y.ft==y.sc)continue;
if(x.ft>y.ft)swap(x,y);
if(y.ft<x.sc&&x.sc<y.sc){
if(find(i)==find(j))return ;
lik(i,j+m),lik(j,i+m);
}
}
}
return ;
}
int main()
{
// freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
if(solve())printf("YES\n");
else printf("NO\n");
}
return ;
}
并查集
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define pb push_back
#define pii pair<int,int>
#define ft first
#define sc second
#define MAXN 200000+10
using namespace std;
struct TSat{
int n;
int fst[MAXN],nxt[MAXN],to[MAXN];
int cnt;
void add(int x,int y){
nxt[++cnt]=fst[x],fst[x]=cnt,to[cnt]=y;
}
void ins(int x,int y){
add(x,y+n);
add(x+n,y);
}
int dfn[MAXN],low[MAXN];
int cmp[MAXN],sta[MAXN],vis[MAXN],top;
int time_dex,tmp;
void init(int n){
this->n=n;
time_dex=tmp=cnt=top=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(fst,,sizeof(fst));
memset(nxt,,sizeof(nxt));
memset(to,,sizeof(to));
memset(cmp,,sizeof(cmp));
}
void Tarjan(int x){
dfn[x]=low[x]=++time_dex;
sta[++top]=x;
vis[x]=;
for(int e=fst[x];e;e=nxt[e]){
int &y=to[e];
if(!dfn[y]){
Tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]){
tmp++;
while(sta[top+]!=x){
cmp[sta[top]]=tmp;
vis[sta[top]]=;
top--;
}
}
}
bool check(){
for(int i=;i<=(n<<);i++){
if(!dfn[i])Tarjan(i);
}
for(int i=;i<=n;i++){
if(cmp[i]==cmp[i+n])
return ;
}
return ;
}
}TS;
int n,m;
int b[MAXN],d[MAXN];
pii E[MAXN];
int solve(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d",&E[i].ft,&E[i].sc);
int t;
for(int i=;i<=n;i++)scanf("%d",&t),d[t]=i;
if(m>*n-)return ;
TS.init(m);
memset(b,,sizeof(b));
for(int i=;i<=m;i++){
E[i].ft=d[E[i].ft],E[i].sc=d[E[i].sc];
if(E[i].ft>E[i].sc){swap(E[i].ft,E[i].sc);}
if(E[i].sc-E[i].ft==||E[i].sc-E[i].ft==n-)b[i]=;
}
pii x,y;
for(int i=;i<=m;i++){
if(b[i])continue;
for(int j=i+;j<=m;j++){
if(b[j])continue;
x=E[i],y=E[j];
if(x.ft==y.ft||x.ft==y.sc)continue;
if(x.sc==y.ft||x.sc==y.sc)continue;
if(x.ft==x.sc||y.ft==y.sc)continue;
if(x.ft>y.ft)swap(x,y);
if(y.ft<x.sc&&x.sc<y.sc){
TS.ins(i,j);
TS.ins(j,i);
}
}
}
return TS.check();
}
int main()
{
// freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
if(solve())printf("YES\n");
else printf("NO\n");
}
return ;
}
2Sat
洛谷P3209 [HNOI2010]PLANAR的更多相关文章
- 洛谷P3209 [HNOI2010]PLANAR(2-SAT)
题目描述 若能将无向图G=(V,E)画在平面上使得任意两条无重合顶点的边不相交,则称G是平面图.判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你要判定的是一类特殊的图,图中存在一个包含所 ...
- 洛谷 P3209 [HNOI2010] 平面图判定
链接: P3209 题意: 给出 \(T\) 张无向图 \((T\leq100)\),并给出它对应的哈密顿回路,判断每张图是否是平面图. 分析: 平面图判定问题貌似是有线性做法的,这里给出链接,不是本 ...
- 洛谷P3209 [HNOI2010]平面图判定(2-SAT)
传送门 看到哈密顿回路就被吓傻了……结果没有好好考虑性质…… 首先,平面图有个性质:边数小于等于$3n-6$(我也不知道为啥),边数大于这个的直接pass 然后考虑原图,先把哈密顿回路单独摘出来,就是 ...
- 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...
- Bzoj2002/洛谷P3203 [HNOI2010]弹飞绵羊(分块)
题面 Bzoj 洛谷 题解 大力分块,分块大小\(\sqrt n\),对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是 ...
- 洛谷P3209平面图判定 [HNOI2010] 2-sat
正解:2-sat(并茶几/强连通分量 解题报告: 传送门w 难受死了,连WA5次,正确率又-=INF了QAQ 然后先说下这题怎么做再来吐槽自己QAQ 首先这题其实和NOIp2010的关押罪犯挺像的,然 ...
- 洛谷 P3205 [HNOI2010]合唱队 解题报告
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- 洛谷——P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
随机推荐
- 201621123050 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- 设计模式NO.1
设计模式NO.1 根据作业要求完成下列题目: 题目1: (1)要求:某系统日志记录器要求支持多种日志记录方式,如文件记录.数据库记录等:用户可以根据要求动态选择日志记录方式.使用Factory模式来设 ...
- JAVA_SE基础——43.抽象类
高手勿喷~ 抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的.例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物, ...
- N阶台阶问题(详解)
原创 问题描述: 有N阶台阶,每一步可以走1步台阶或者2步台阶,求出走到第N阶台阶的方法数. 解题思路: 类似于建立树的过程 1 2 1 2 1 2 1 2 1 2 ...
- 韩顺平dedecms讲解上课记录
感谢韩顺平: 如何打开php的gd库,通过php设置->php扩展-->phpdb库;打上勾就行: dede存在四张十分重要的表,channeltype,模型表最原始的发源arctype: ...
- 详解JavaScript对象继承方式
一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数成为 Children 的方法,然 ...
- GIT入门笔记(1)- Git的基本概念
一.概念和定义 1.git是什么 许多人习惯用复制整个项目目录的方式来保存不同的项目版本,或许还会改名加上备份时间以示区别.这么做唯一的好处就是简单.不过坏处也不少:有时候会混淆所在的工作目录,一旦弄 ...
- ssh整合之四单独搭建struts的运行环境
1.导入struts的基本jar包 2.在web.xml中配置我们struts的核心控制器StrutsPrepareAndExecuteFilter <?xml version="1. ...
- python实现 双向循环链表
最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...
- 【笔记】css 自定义select 元素的箭头样式
原文链接:https://www.imooc.com/qadetail/187585?t=281881 最近项目需要自定义select 元素的样式,搜索了一下发现了通过设置select 元素 css ...