poj3683
发布日期:2021-05-06 23:45:57 浏览次数:19 分类:技术文章

本文共 2298 字,大约阅读时间需要 7 分钟。

题意:有n对新人要举行仪式,每对都有两个时间段可以选择,问是否可以所有新人的仪式时间不重叠

然后还要输出方式

今天听智杰dalao说今年noi考了2-sat

然而我听都没听过TAT。。
于是今天下午就去颓了一下下 是真的在颓

要学的人可以看看这篇吧,挺好的。。

其实我看的不是很认真因为我在颓,但边看边自己想了一下,感觉还好。。

本来是想去做那个入门题,poi0106那个,但是poi?我没去过啊。。去看了一下就逃了回来这题了

2-sat模板题吧。。

贴个模板
感觉基本功能都在了。。

弄了半天,结果发现是强连通打错了。。

#include
#include
#include
#include
#include
using namespace std;const int N=2005;const int M=2000005;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';ch=getchar();} return x*f;}int n;int a[N],b[N];//开始时间 结束时间bool jud(int x,int y){ if(b[x]<=a[y]||a[x]>=b[y])return 0; return 1;}struct qq{ int x,y,last;}s[M];int num,last[N];void init (int x,int y){ num++; s[num].x=x;s[num].y=y; s[num].last=last[x]; last[x]=num; return ;}void bt (){ num=0;memset(last,-1,sizeof(last)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++)//这两对新人的冲突关系 冲突就连边 { if(jud(2*i,2*j)) {init(2*i,2*j-1);init(2*j,2*i-1);} if(jud(2*i,2*j-1)) {init(2*i,2*j);init(2*j-1,2*i-1);} if(jud(2*i-1,2*j)) {init(2*i-1,2*j-1);init(2*j,2*i);} if(jud(2*i-1,2*j-1)){init(2*i-1,2*j);init(2*j-1,2*i);} } }}int dfn[N],low[N],id=0;int sta[N],top;bool v[N];int belong[N],lalal=0;int mymin (int x,int y){ return x
q; for (int u=1;u<=lalal;u++) if (du[u]==0) q.push(u); while (!q.empty()) { int x=q.front();q.pop(); if (col[x]) continue; col[x]=1;dfs1(op[x]); for (int u=last2[x];u!=-1;u=s1[u].last) { int y=s1[u].y; du[y]--; if (du[y]==0) q.push(y); } }}int main(){ n=read(); for (int u=1;u<=n;u++) { a[2*u]=read()*60+read(); b[2*u-1]=read()*60+read(); int x=read(); b[2*u]=a[2*u]+x;a[2*u-1]=b[2*u-1]-x; } bt(); memset(v,false,sizeof(v)); memset(dfn,-1,sizeof(dfn)); for (int u=1;u<=2*n;u++) { if (dfn[u]==-1)dfs(u); // printf("%d %d\n",u,belong[u]); } for (int u=1;u<=n;u++) if (belong[2*u]==belong[2*u-1]) { printf("NO");return 0; } printf("YES\n"); rebt(); for (int u=1;u<=n;u++) { op[belong[2*u]]=belong[2*u-1]; op[belong[2*u-1]]=belong[2*u]; } topsort(); for(int i=1;i<=n;i++) if(col[belong[2*i]]==1) print(a[2*i]),print(b[2*i]),puts(""); else print(a[2*i-1]),print(b[2*i-1]),puts(""); return 0;}
上一篇:字符串难题
下一篇:bzoj 1483: [HNOI2009]梦幻布丁 线段树合并

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月28日 03时24分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章