POJ 3683 Priest John's Busiest Day

时间:2023-03-08 18:41:47

2-SAT简单题,判断一下两个开区间是否相交

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std; const int maxn=+;
int N,M;
struct Time
{
int Start;
int End;
int cost;
int S1,E1,S2,E2;
} t[maxn];
char s[]; struct TwoSAT
{
int n;
vector<int> G[maxn*];
bool mark[maxn*];
int S[maxn*],c; bool dfs(int x)
{
if(mark[x^]) return false;
if(mark[x]) return true;
mark[x]=true;
S[c++]=x;
for(int i=;i<G[x].size();i++)
if(!dfs(G[x][i])) return false;
return true;
} void init(int n)
{
this->n=n;
for(int i=;i<n*;i++) G[i].clear();
memset(mark,,sizeof mark);
} void add_clause(int x,int y)
{
G[x].push_back(y^);
G[y].push_back(x^);
} bool solve()
{
for(int i=;i<*n;i+=)
if(!mark[i]&&!mark[i+])
{
c=;
if(!dfs(i))
{
while(c>) mark[S[--c]]=false;
if(!dfs(i+)) return false;
}
}
return true;
}
}; bool F(int x1,int y1,int x2,int y2)
{
if(x1<x2&&x2<y1) return ;//区间相交
if(x1<y2&&y2<y1) return ;//区间相交
if(x2<x1&&x1<y2) return ;//区间相交
if(x2<y1&&y1<y2) return ;//区间相交
if(x1==x2||y1==y2) return ;//区间相交
return ;//区间不相交
} int main()
{
while(~scanf("%d",&N))
{
TwoSAT T; T.n=N; T.init(N);
for(int i=; i<N; i++)
{
int h1,h2,m1,m2,tt; scanf("%s",s);
h1=(s[]-'')*+(s[]-'');
m1=(s[]-'')*+(s[]-''); scanf("%s",s);
h2=(s[]-'')*+(s[]-'');
m2=(s[]-'')*+(s[]-''); scanf("%d",&tt); t[i].Start=h1*+m1;
t[i].End=h2*+m2;
t[i].cost=tt; t[i].S1=t[i].Start;
t[i].E1=t[i].Start+t[i].cost; t[i].S2=t[i].End-t[i].cost;
t[i].E2=t[i].End;
} for(int i=;i<N;i++)
{
for(int j=i+;j<N;j++)
{
if(F(t[i].S1,t[i].E1,t[j].S1,t[j].E1))
T.add_clause(*i,*j);
if(F(t[i].S1,t[i].E1,t[j].S2,t[j].E2))
T.add_clause(*i,*j+);
if(F(t[i].S2,t[i].E2,t[j].S1,t[j].E1))
T.add_clause(*i+,*j);
if(F(t[i].S2,t[i].E2,t[j].S2,t[j].E2))
T.add_clause(*i+,*j+);
}
}
if(T.solve())
{
printf("YES\n");
for(int i=;i<N;i++)
{
if(T.mark[*i]) printf("%02d:%02d %02d:%02d\n",t[i].S1/,t[i].S1%,t[i].E1/,t[i].E1%);
else printf("%02d:%02d %02d:%02d\n",t[i].S2/,t[i].S2%,t[i].E2/,t[i].E2%);
}
}
else printf("NO\n");
}
return ;
}