首页 > 代码库 > poj3648 wedding 2-SAT
poj3648 wedding 2-SAT
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; #include<vector> #define N 8200 int e[N],v[N],ne[N]; int nn; void add(int x,int y){ ne[++nn]=e[x],e[x]=nn,v[nn]=y; } int e2[N],nn2,v2[N],ne2[N]; void add2(int x,int y){ ne2[++nn2]=e2[x],e2[x]=nn2,v2[nn2]=y; } int stn,st[N]; int been[N]; int low[N],dfn[N]; int in[N]; int ru[N],tot,bn; vector<int> jj[N]; int col[N]; void cl(){ memset(col,0,sizeof(col)); memset(been,0,sizeof(been)); memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(e,0,sizeof(e)); memset(e2,0,sizeof(e2)); memset(ru,0,sizeof(ru)); nn=0,nn2=0; bn=0; tot=0; } int qu[N],he,bo; void dfs(int x){ low[x]=dfn[x]=++tot; st[++stn]=x; been[x]=1; for(int i=e[x];i;i=ne[i]){ if(!dfn[v[i]]){ dfs(v[i]); low[x]=min(low[x],low[v[i]]); }else if(been[v[i]])low[x]=min(low[x],dfn[v[i]]); } if(dfn[x]==low[x]){ bn++; do{ in[st[stn]]=bn; been[st[stn]]=0; }while(st[stn--]!=x); } } int main(){ while(scanf("%d%d",&n,&m),n){ cl(); for(int i=1;i<=m;i++){ int a,b; char c,d; scanf("%d",&a); scanf("%c",&c); scanf("%d",&b); scanf("%c",&d); a++,b++; if(c==‘h‘){ if(d==‘h‘)add(a,b+n),add(b,a+n); else add(a,b),add(b+n,a+n); } if(c==‘w‘){ if(d==‘h‘)add(a+n,b+n),add(b,a); else add(a+n,b),add(b+n,a); } } add(1+n,1); for(int i=1;i<=n*2;i++)if(!dfn[i])dfs(i); for(int i=1;i<=n;i++)if(in[i]==in[i+n]){ printf("bad luck\n"); goto loop; } for(int i=1;i<=n*2;i++){ for(int j=e[i];j;j=ne[j])if(in[i]!=in[v[j]]){ add2(in[v[j]],in[i]); ru[in[i]]++; } } for(int i=1;i<=bn;i++)jj[i].clear(); for(int i=1;i<=n;i++){ jj[in[i]].push_back(in[i+n]); jj[in[i+n]].push_back(in[i]); } bo=1; he=0; for(int i=1;i<=bn;i++){ if(!ru[i])qu[++he]=i; } while(he>=bo){ int x=qu[bo++]; if(col[x])continue; for(int j=0;j<jj[x].size();j++){ col[jj[x][j]]=1; } for(int i=e2[x];i;i=ne2[i]){ ru[v2[i]]--; if(!ru[v2[i]])qu[++he]=v2[i]; } } for(int i=2;i<=n;i++)if(col[in[i]]){ printf("%dh ",i-1); }else{ printf("%dw ",i-1); } printf("\n"); loop:; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。