您的位置:首页 > 其它

POJ3683 Falsita

2016-07-02 17:58 246 查看
http://poj.org/problem?id=3683

思路: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();
}


为什么我会犯用错数组这种错误。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: