http://poj.org/problem?id=3683

思路:2-SAT,输出任意一组方案,O(m+n)

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
int first[],next[],tot,go[];
int First[],Next[],Tot,Go[];
int b[],a[],n,ru[],low[],dfn[];
int op[],belong[],instack[],vis[],st[],c[],col[],sz,num,top;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void Insert(int x,int y){
Tot++;
Go[Tot]=y;
Next[Tot]=First[x];
First[x]=Tot;
}
bool jud(int x,int y){
if (b[x]<=a[y]||a[x]>=b[y]) return ;
else return ;
}
void build(){
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
if (jud(i*-,j*)){
insert(i*-,j*-);
insert(j*,i*);
}
if (jud(i*-,j*-)){
insert(i*-,j*);
insert(j*-,i*);
}
if (jud(i*,j*)){
insert(i*,j*-);
insert(j*,i*-);
}
if (jud(i*,j*-)){
insert(i*,j*);
insert(j*-,i*-);
}
}
}
void init(){
n=read();
for (int i=;i<=n;i++){
a[i*]=read();
a[i*]=a[i*]*+read();
b[i*-]=read();
b[i*-]=b[i*-]*+read();
int x=read();
b[i*]=a[i*]+x;
a[i*-]=b[i*-]-x;
}
}
void tarjan(int x){
low[x]=dfn[x]=++sz;
instack[x]=vis[x]=;st[++top]=x;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (!vis[pur]){
tarjan(pur);
low[x]=std::min(low[x],low[pur]);
}else if (instack[pur]){
low[x]=std::min(low[x],dfn[pur]);
}
}
if (low[x]==dfn[x]){
num++;
while (st[top]!=x){
instack[st[top]]=;
belong[st[top]]=num;
top--;
}
instack[st[top]]=;
belong[st[top]]=num;
top--;
}
}
void Tarjan(){
for (int i=;i<=*n;i++)
if (!vis[i]) tarjan(i);
}
bool judge(){
for (int i=;i<=n;i++)
if (belong[i*]==belong[i*-]) {
puts("NO");
return ;
}
puts("YES");
return ;
}
void dfs(int x){
if (col[x]) return ;col[x]=-;
for (int i=First[x];i;i=Next[i]){
int pur=Go[i];
dfs(pur);
}
}
void topsort(){
int t=;
for (int i=;i<=num;i++)
if (!ru[i]) c[++t]=i;
while (t){
int now=c[t--];
if (col[now]) continue;col[now]=;
dfs(op[now]);
for (int i=First[now];i;i=Next[i]){
int pur=Go[i];
ru[pur]--;
if (ru[pur]==) c[++t]=pur;
}
}
}
void rebuild(){
for (int i=;i<=*n;i++)
for (int j=first[i];j;j=next[j]){
int pur=go[j];
if (belong[pur]==belong[i]) continue;
ru[belong[i]]++;
Insert(belong[pur],belong[i]);;
}
for (int i=;i<=*n;i++)
op[belong[i*]]=belong[i*-],op[belong[i*-]]=belong[i*];
}
void print(int x){
printf("%.2d:",x/);
printf("%.2d ",x%);
}
void Output(){
for (int i=;i<=n;i++)
if (col[belong[i*]]==){
print(a[i*]);print(b[i*]);puts("");
}else{
print(a[i*-]);print(b[i*-]);puts("");
}
}
int main(){
init();
build();
Tarjan();
if (judge()) return ;
rebuild();
topsort();
Output();
}

为什么我会犯用错数组这种错误。。

POJ3683 Falsita的更多相关文章

  1. poj3683

    poj3683 题意 n对新人举行婚礼,婚礼在不同时间段但可能重叠,婚礼有开始(Si).结束(Ti).仪式举行时间(Di),问能否给出一种举行方案,使得神父能参加所有的婚礼并举行仪式. 分析 xi为真 ...

  2. [BZOJ3683]Falsita

    [BZOJ3683]Falsita 题目大意: 一个\(n(n\le3\times10^5)\)个结点的树,每个结点有一个权值\(w_i\),\(m(m\le3\times10^5)\)次操作,操作包 ...

  3. 2-sat——输出方案poj3683

    一篇讲的详细的博客 https://blog.csdn.net/Hawo11/article/details/74908233 缩点后为什么要建立反图? 如果是按原图处理,选择一个点之后要把所有其后续 ...

  4. NKOJ-4573 Falsita

    问题描述: 到海边了呢...... 如果没有那次选择,现在是不是会好些呢...... 都过去了. 仰望着星空,迎面吹过一阵阵海风,倚靠着护栏,Fine 在海边静静地伫立着,在一个个无际的长夜后,Fin ...

  5. 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8170   Accept ...

  6. poj3683 Priest John's Busiest Day

    2-SAT 输出可行解 找可行解的方案就是: 根据第一次建的图建一个反图..然后求逆拓扑排序,建反图的原因是保持冲突的两个事件肯定会被染成不同的颜色 求逆拓扑排序的原因也是为了对图染的色不会发生冲突, ...

  7. poj3683 Priest John's Busiest Day

    2-SAT. 读入用了黄学长的快速读入,在此膜拜感谢. 把每对时间当作俩个点.如果有交叉代表相互矛盾. 然后tarjan缩点,这样就能得出当前的2-SAT问题是否有解. 如果有解,跑拓扑排序就能找出一 ...

  8. 【POJ3683】Priest John's Busiest Day

    题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...

  9. Poj3683:Priest John's Busiest Day

    题意 n对夫妻要结婚,第i对夫妻结婚的婚礼持续时间为[Si, Ti],他们会举行一个仪式,仪式时间为Di,这个仪式只能举行在开头或者结尾举行,要么[Si, Si+Di],要么[Ti-Di, Ti],然 ...

随机推荐

  1. SPOJ 0962 Intergalactic Map

    题目大意:在一个无向图中,一个人要从A点赶往B点,之后再赶往C点,且要求中途不能多次经过同一个点.问是否存在这样的路线.(3 <= N <= 30011, 1 <= M <= ...

  2. HDU_2025——查找最大的字母

    Problem Description 对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”.   Input 输入数据包括多个测试实例,每个实例由一行长度不超过100的字符 ...

  3. HDU-1176(基础方程DP)

    Problem Description 都 说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉, 就掉落在他 ...

  4. 爬虫学习-使用CrawlSpider

    使用scrapy中的CrawlSpider类来进行爬行 一直用的是BaseSpider,回调函数的方式,有一个问题是title,date在一个页面,author,detail在另一个页面时,怎么把这些 ...

  5. animate.min.css 动画样式移动端存在的问题

    使用animate.min.css可以使用很多动画效果,包括3D效果,现在也可以应用于HTML5手机移动端,使用切换效果的时候会导致页面出现卡顿现象,可以使用css3 transform 方法硬件加速 ...

  6. 转载: C#: Left outer joins with LINQ

    I always considered Left Outer Join in LINQ to be complex until today when I had to use it in my app ...

  7. ExtJS4.2学习(11)——高级组件之Grid

    大纲: 1.首先,搭建起来一个最基础的Grid组件: 2.其次,利用前边MVC架构将代码重构: 3.再者,介绍下Grid的一些特性. 一.搭建基础的Grid组件 在文章的开始,我们首先简单的搭建一个G ...

  8. [ES6] WeakMap vs Map

    WeakMap: is a type of Map where only objects can be passed as keys. Primitive data type -- such are ...

  9. 十二.200多万元得到的创业教训--app名字是关键

    摘要:当完毕了一个app后,就要须要上应用市场,以下讲一下起名和上应用市场的一些技巧. 健生干货分享:第12篇 1.必须是先上app store,再上其它应用市场 为啥要这样做?由于app store ...

  10. Java基础知识强化35:String类之String的其他功能

    1. String类的其他功能: (1)替换功能: String replace(char old, char new) String replace(String old,String new) ( ...