poj3683

来源:互联网 发布:java流程管理系统 编辑:程序博客网 时间:2024/06/13 22:42

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

今天听智杰dalao说今年noi考了2-sat
然而我听都没听过TAT。。
于是今天下午就去颓了一下下 是真的在颓

要学的人可以看看这篇吧,挺好的。。
http://blog.csdn.net/jarjingx/article/details/8521690

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

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

2-sat模板题吧。。
贴个模板
感觉基本功能都在了。。

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

#include<cstdio>#include<queue>#include<algorithm>#include<iostream>#include<cstring>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<y?x:y;}void dfs (int x){    low[x]=dfn[x]=++id;    sta[++top]=x;    v[x]=true;    for (int u=last[x];u!=-1;u=s[u].last)    {        int y=s[u].y;        if (dfn[y]==-1)        {            dfs(y);            low[x]=mymin(low[x],low[y]);        }        else if (v[y]) low[x]=mymin(low[x],low[y]);    }    if (low[x]==dfn[x])    {        lalal++;        int i;        do{            i=sta[top--];            v[i]=false;            belong[i]=lalal;        }while(i!=x);    }}qq s1[M];int num2,last2[N];int du[N];void init2 (int x,int y){    du[y]++;    num2++;    s1[num2].x=x;s1[num2].y=y;    s1[num2].last=last2[x];    last2[x]=num2;}void rebt(){    num2=0;memset(last2,-1,sizeof(last2));    for (int u=1;u<=2*n;u++)        for (int i=last[u];i!=-1;i=s[i].last)        {            int y=s[i].y;            if (belong[u]!=belong[y])                init2(belong[y],belong[u]);        }}void print(int x){    printf("%.2d:",x/60);    printf("%.2d ",x%60);}int op[N];int col[N];void dfs1 (int x){    if (col[x]) return ;    col[x]=2;    for (int u=last2[x];u!=-1;u=s1[u].last)        dfs1(s1[u].y);}void topsort(){    queue<int> 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;}
原创粉丝点击