看错题*n,注意是输出新娘这边的……

按2-SAT规则连互斥的边,然后注意连一条(1,1+n)表示新娘必选

然后输出color[belong[i]]==color[belong[1+n(新娘)]]的点即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N=1000005;
int n,m,h[N],cnt,dfn[N],low[N],tot,s[N],top,bl[N],col,id[N],c[N],d[N],du[N];
bool v[N];
struct qwe
{
int ne,no,to;
}e[N<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
if(p=='w')
r+=n;
return r;
}
void add(int u,int v)
{//cerr<<u<<" "<<v<<endl;
cnt++;
e[cnt].ne=h[u];
e[cnt].no=u;
e[cnt].to=v;
h[u]=cnt;
}
void tarjan(int u)
{
dfn[u]=low[u]=++tot;
v[s[++top]=u]=1;
for(int i=h[u];i;i=e[i].ne)
{
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[u]=min(low[u],low[e[i].to]);
}
else if(v[e[i].to])
low[u]=min(low[u],dfn[e[i].to]);
}
if(low[u]==dfn[u])
{
col++;
while(s[top]!=u)
{
bl[s[top]]=col;
v[s[top--]]=0;
}
bl[s[top]]=col;
v[s[top--]]=0;
}
}
int main()
{
while(1)
{
n=read(),m=read();
if(n+m==0)
break;
memset(dfn,0,sizeof(dfn));
memset(h,0,sizeof(h));
memset(c,0,sizeof(c));
memset(v,0,sizeof(v));
memset(du,0,sizeof(du));
cnt=0,tot=0,top=0,col=0;
for(int i=1;i<=n;i++)
d[i]=i+n,d[i+n]=i;
for(int i=1;i<=m;i++)
{
int x=read()+1,y=read()+1;
add(x,d[y]),add(y,d[x]);
}
add(1+n,1);
for(int i=1;i<=n+n;i++)
if(!dfn[i])
tarjan(i);
bool fl=0;
for(int i=1;i<=n;i++)
{
if(bl[i]==bl[i+n])
{
fl=1;
break;
}
id[bl[i]]=bl[i+n];
id[bl[i+n]]=bl[i];
}
if(fl)
{
puts("bad luck");
continue;
}
vector<pair<int,int> >b;
for(int i=1;i<=cnt;i++)
if(bl[e[i].no]!=bl[e[i].to])
b.push_back(make_pair(bl[e[i].to],bl[e[i].no]));
memset(h,0,sizeof(h));
cnt=0;
for(int i=0,len=b.size();i<len;i++)
add(b[i].first,b[i].second),du[b[i].second]++;
queue<int>q;
for(int i=1;i<=col;i++)
if(!du[i])
q.push(i);
while(!q.empty())
{
int u=q.front();//cerr<<u<<" ";
q.pop();
if(!c[u])
c[u]=1,c[id[u]]=2;
for(int i=h[u];i;i=e[i].ne)
if(!(--du[e[i].to]))
q.push(e[i].to);
}
for(int i=2;i<=n;i++)
{
if(c[bl[i]]==c[bl[1+n]])
printf("%dh ",i-1);
else
printf("%dw ",i-1);
}
puts("");
}
return 0;
}

poj 3648 Wedding【2-SAT+tarjan+拓扑】的更多相关文章

  1. POJ 3648 Wedding(2-SAT的模型运用+DFS | Tarjan)

    Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 3170   Specia ...

  2. poj 3648 Wedding 2-SAT问题入门题目

    Description Up to thirty couples will attend a wedding feast, at which they will be seated on either ...

  3. POJ - 3648 Wedding (2-SAT 输出解决方案)

    题意:有N-1对夫妇和1对新郎新娘要出席婚礼,这N对人要坐在走廊两侧.要求每对夫妇要坐在不同侧.有M对人有通奸关系,对于这一对人,不能同时坐在新娘对面(新娘新郎也可能和别人有通奸关系).求如何避免冲突 ...

  4. POJ.3648.Wedding(2-SAT)

    题目链接 题意看这吧..https://www.cnblogs.com/wenruo/p/5885948.html \(Solution\) 每对夫妇只能有一个坐在新娘这一边,这正符合2-SAT初始状 ...

  5. POJ 3648 Wedding (2-SAT,经典)

    题意:新郎和新娘结婚,来了n-1对夫妻,这些夫妻包括新郎之间有通奸关系(包括男女,男男,女女),我们的目地是为了满足新娘,新娘对面不能坐着一对夫妻,也不能坐着有任何通奸关系的人,另外新郎一定要坐新娘对 ...

  6. POJ 3648 Wedding

    2-SAT,直接选择新娘一侧的比较难做,所以处理的时候选择新郎一侧的,最后反着输出就可以. A和B通奸的话,就建边 A->B'以及B->A’,表示 A在新郎一侧的话,B一定不在:B在新郎一 ...

  7. 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp

    题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...

  8. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  9. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

随机推荐

  1. Atlassian Confluence安装

    前言 Confluence与Jira 由于线上jira和confluence之前互相关联,confluence的登录用户全部关联自jira的用户,confluence安装时会提示是否关联jira,由于 ...

  2. POJ 2184 Cow Exhibition (01背包变形)(或者搜索)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10342   Accepted: 4048 D ...

  3. Android应用程序窗体View的创建过程

    View类是android中非常重要的一个类.view是应用程序界面的直观体现,我们看到的应用程序界面就能够看作是View(视图)组成的. 那么我们应用程序的界面是怎么创建的呢,也就是应用程序的Vie ...

  4. 【hdu】Mayor&#39;s posters(线段树区间问题)

    须要离散化处理,线段树的区间改动问题. 须要注意的就是离散化的时候,由于给的数字是一段单位长度,所以须要特殊处理(由于线段的覆盖和点的覆盖是不一样的) 比方:(1,10)(1,4) (6,10) 离散 ...

  5. SequenceFile

    org.apache.hadoop.io包里的SequenceFile类提供了高效的二进制文件格式,它经常用于MapReduce作业的输出.尤其是当作业的输出被当做另一个作业的输入时.Sequence ...

  6. oracle的索引有几种?各有何用途?

    1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名.CREATE INDEX语句时,默认就是在创建b-tree索引.没有特别规定 ...

  7. hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1582 : Territorial Dispute 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Ja ...

  8. B.大钉骑马走江湖

    江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点. 当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物, ...

  9. poj 1860 Currency Exchange 解题报告

    题目链接:http://poj.org/problem?id=1860 题目意思:给出 N 种 currency, M种兑换方式,Nick 拥有的的currency 编号S 以及他的具体的curren ...

  10. rcfile

    转自:http://flyingdutchman.iteye.com/blog/1871025 在当前的基于Hadoop系统的数据仓库中,数据存储格式是影响数据仓库性能的一个重要因素.Facebook ...