POJ3683 Falsita
2016-07-02 17:58
246 查看
http://poj.org/problem?id=3683
思路:2-SAT,输出任意一组方案,O(m+n)
为什么我会犯用错数组这种错误。。
思路:2-SAT,输出任意一组方案,O(m+n)
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> int first[2000005],next[2000005],tot,go[2000005]; int First[2000005],Next[2000005],Tot,Go[2000005]; int b[200005],a[200005],n,ru[200005],low[200005],dfn[200005]; int op[2000005],belong[200005],instack[200005],vis[200005],st[200005],c[200005],col[200005],sz,num,top; int read(){ int t=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';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 0; else return 1; } void build(){ for (int i=1;i<=n;i++) for (int j=i+1;j<=n;j++){ if (jud(i*2-1,j*2)){ insert(i*2-1,j*2-1); insert(j*2,i*2); } if (jud(i*2-1,j*2-1)){ insert(i*2-1,j*2); insert(j*2-1,i*2); } if (jud(i*2,j*2)){ insert(i*2,j*2-1); insert(j*2,i*2-1); } if (jud(i*2,j*2-1)){ insert(i*2,j*2); insert(j*2-1,i*2-1); } } } void init(){ n=read(); for (int i=1;i<=n;i++){ a[i*2]=read(); a[i*2]=a[i*2]*60+read(); b[i*2-1]=read(); b[i*2-1]=b[i*2-1]*60+read(); int x=read(); b[i*2]=a[i*2]+x; a[i*2-1]=b[i*2-1]-x; } } void tarjan(int x){ low[x]=dfn[x]=++sz; instack[x]=vis[x]=1;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]]=0; belong[st[top]]=num; top--; } instack[st[top]]=0; belong[st[top]]=num; top--; } } void Tarjan(){ for (int i=1;i<=2*n;i++) if (!vis[i]) tarjan(i); } bool judge(){ for (int i=1;i<=n;i++) if (belong[i*2]==belong[i*2-1]) { puts("NO"); return 1; } puts("YES"); return 0; } void dfs(int x){ if (col[x]) return ;col[x]=-1; for (int i=First[x];i;i=Next[i]){ int pur=Go[i]; dfs(pur); } } void topsort(){ int t=0; for (int i=1;i<=num;i++) if (!ru[i]) c[++t]=i; while (t){ int now=c[t--]; if (col[now]) continue;col[now]=1; dfs(op[now]); for (int i=First[now];i;i=Next[i]){ int pur=Go[i]; ru[pur]--; if (ru[pur]==0) c[++t]=pur; } } } void rebuild(){ for (int i=1;i<=2*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=1;i<=2*n;i++) op[belong[i*2]]=belong[i*2-1],op[belong[i*2-1]]=belong[i*2]; } void print(int x){ printf("%.2d:",x/60); printf("%.2d ",x%60); } void Output(){ for (int i=1;i<=n;i++) if (col[belong[i*2]]==1){ print(a[i*2]);print(b[i*2]);puts(""); }else{ print(a[i*2-1]);print(b[i*2-1]);puts(""); } } int main(){ init(); build(); Tarjan(); if (judge()) return 0; rebuild(); topsort(); Output(); }
为什么我会犯用错数组这种错误。。
相关文章推荐
- Spring Log4j2 log4j2.xml
- Gitosis管理(权限管理建议使用这种方法)
- 第四章 Hello,Shaders
- Linux 安装 JDK1.7.0_79
- Laravel 5.1 使用短信验证码插件laravel-sms
- Microsoft Azure Java Usage Demo
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
- Executors
- 策略模式
- Retrofit2.0 或OKHttp 日志log
- Java 调用 Azure HTTPS API 证书问题
- 基于链表的图搜索
- 在宇宙间不易被风吹散 —— 太阳系八大行星 (二)
- Bootstrap table使用心得
- js const
- Encountered 1 errors during the transfer
- Using JMS with Azure Service Bus and AMQP 1.0 (New)
- Java-类库-Guava-Bimap
- Spring JMS with Azure Service Bus