1997: [Hnoi2010]Planar 2-SAT
2016-01-13 11:04
239 查看
时隔几日再回来做这个题,开始用二分图染色A掉了。
看起来建图与那个恰恰相反,恩。
若边i和边j矛盾,那么我们要连边:
i->j’,i’->j,j->i’,j’->i。
又是一道裸的2-SAT,依旧不用输出方案QAQ。
看起来建图与那个恰恰相反,恩。
若边i和边j矛盾,那么我们要连边:
i->j’,i’->j,j->i’,j’->i。
又是一道裸的2-SAT,依旧不用输出方案QAQ。
[code]#include<iostream> #include<cstdio> #include<cstring> using namespace std; int u[10005],v[10005],head[2005],pos[2005],dfn[2005],low[2005],belong[2005],stack[2005]; int n,m,tot,sum,cnt,top,scc,flag,Case; int next[1000005],list[1000005]; bool inset[2005]; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline void insert(int x,int y) { next[++cnt]=head[x]; head[x]=cnt; list[cnt]=y; } void dfs(int x) { low[x]=dfn[x]=++sum; stack[++top]=x; inset[x]=1; for (int i=head[x];i;i=next[i]) if (!dfn[list[i]]) { dfs(list[i]); low[x]=min(low[x],low[list[i]]); } else if (inset[list[i]]) low[x]=min(low[x],dfn[list[i]]); if (low[x]==dfn[x]) { int i=-1; scc++; while (i!=x) { i=stack[top--]; belong[i]=scc; inset[i]=0; } } } inline void tarjan() { for (int i=1;i<=2*tot;i++) if (!dfn[i]) dfs(i); } int main() { Case=read(); while (Case--) { memset(head,0,sizeof(head)); memset(dfn,0,sizeof(dfn)); flag=tot=sum=top=cnt=scc=0; n=read(); m=read(); for (int i=1;i<=m;i++) u[i]=read(),v[i]=read(); for (int i=1,x;i<=n;i++) x=read(),pos[x]=i; if (m>3*n-6) {puts("NO"); continue;} for (int i=1;i<=m;i++) { u[i]=pos[u[i]]; v[i]=pos[v[i]]; if (u[i]>v[i]) swap(u[i],v[i]); if (v[i]-u[i]==1||v[i]-u[i]==n-1) continue; u[++tot]=u[i]; v[tot]=v[i]; } for (int i=1;i<=tot;i++) for (int j=i+1;j<=tot;j++) if ((u[i]<u[j]&&u[j]<v[i]&&v[i]<v[j])||(u[j]<u[i]&&u[i]<v[j]&&v[j]<v[i])) insert(2*i-1,2*j),insert(2*j-1,2*i),insert(2*i,2*j-1),insert(2*j,2*i-1); tarjan(); for (int i=1;i<=tot;i++) if (belong[2*i-1]==belong[2*i]) {flag=1; break;} flag?puts("NO"):puts("YES"); } return 0; }
相关文章推荐
- 交叉验证(Cross Validation)方法思想简介
- Shell_NotifyIcon 系统托盘
- [转]设定version 更新js缓存
- FreeMarker常用标签介绍(Html,Jsp)
- kvc to nsdata
- linux下PS1命令提示符设置
- meta name="viewport" content="width=device-width,initial-scale=1.0" 解释
- python基础之安装python
- struts2默认拦截器之prepare
- linux 配置 java环境
- iOS中的delegate的用法和规范
- 侧边快速滑动搜索的SectionIndexer接口简单使用
- Android LayoutInflater深度解析 给你带来全新的认识
- 为知笔记 VS 有道笔记
- java多线程--实现Runnable接口方式
- 三 类初始化概述
- 设置windows status bar隐藏
- NavigationBar及backBarItem调整
- UIImage和Base64格式图片相互转化!
- MySql 语句优化