当前位置: 首页 > news >正文

POJ 3648 Wedding(2-ST)

题目链接:http://poj.org/problem?id=3648

题意:有n对夫妇(编号0到n-1),这些人中有m对人有暧昧关系。现在这些人坐成两排,要求:

1、每对夫妇两个人不能坐在一排;

2、有暧昧关系的人不能都坐在0号新娘的对面。

如果存在满足上述条件的坐法,输出和0号新娘坐在一排的人;否则输出bad luck。

思路:

(1)i:i号新娘在左边

(2)i+n:i号丈夫在左边

(3)i+2*n:i号新娘在右边

(4)i+3*n:i号丈夫在右边 

 #include <stdio.h>
 #include <string.h>
 #include <stack>
 #define min(x,y) ((x)<(y)?(x):(y))
 using namespace std;
 
 struct node
 {
     int v,next;
 };
 
 
 
 const int MAX=1005;
 const int MAXE=100005;
 node edges[MAXE];
 int head[MAX],e;
 int dfn[MAX],low[MAX],visit[MAX],color[MAX],col[MAX];
 int n,m,index,cnt;
 stack<int> S;
 int deg[MAX],ans[MAX],p[MAX];
 int head1[MAX],e1;
 node edges1[MAXE];
 
 
 
 void Add(int u,int v)
 {
     edges[e].v=v;
     edges[e].next=head[u];
     head[u]=e++;
 }
 
 void Add1(int u,int v)
 {
     edges1[e1].v=v;
     edges1[e1].next=head1[u];
     head1[u]=e1++;
 }
 
 void Tarjan(int u)
 {
     int i,v;
 
     low[u]=dfn[u]=++index;S.push(u);visit[u]=1;
     for(i=head[u];i!=-1;i=edges[i].next)
     {
         v=edges[i].v;
         if(!dfn[v])
         {
             Tarjan(v);
             low[u]=min(low[u],low[v]);
         }
         else if(visit[v]) low[u]=min(low[u],dfn[v]);
     }
     if(dfn[u]==low[u])
     {
         cnt++;
         do
         {
             v=S.top();
             S.pop();
             visit[v]=0;
             color[v]=cnt;
         }while(u!=v);
     }
 }
 
 void init(int n)
 {
     memset(deg,0,sizeof(deg));
     memset(head1,-1,sizeof(head1));
     e1=0;
     int i,u,v,x,y;
     for(u=0;u<2*n;u++)
     {
         for(i=head[u];i!=-1;i=edges[i].next)
         {
             v=edges[i].v;
             if(color[v]!=color[u])
             {
                 x=color[v];
                 y=color[u];
                 Add1(x,y);
                 deg[y]++;
             }
         }
     }
     while(!S.empty()) S.pop();
     for(i=1;i<=cnt;i++) if(!deg[i]) S.push(i);
     memset(p,0,sizeof(p));
     while(!S.empty())
     {
         u=S.top();
         S.pop();
         if(!p[u]) p[u]=1,p[col[u]]=-1;
         for(i=head1[u];i!=-1;i=edges1[i].next)
         {
             v=edges1[i].v;
             if(--deg[v]==0) S.push(v);
         }
     }
     memset(ans,0,sizeof(ans));
     for(i=0;i<n/2;i++)
     {
         if(p[color[i]]==p[color[0]]) ans[i]=1;
     }
 }
 
 int TWO_ST(int n)
 {
     int i;
 
     memset(dfn,0,sizeof(dfn));
     memset(visit,0,sizeof(visit));
     index=cnt=0;
     while(!S.empty()) S.pop();
     for(i=0;i<2*n;i++) if(!dfn[i]) Tarjan(i);
     for(i=0;i<n;i++)
     {
         if(color[i]==color[i+n]) return 0;
         col[color[i]]=color[i+n];
         col[color[i+n]]=color[i];
     }
     init(n);
     return 1;
 }
 
 void deal()
 {
     if(!TWO_ST(2*n))
     {
         puts("bad luck");
         return;
     }
     int i;
     for(i=1;i<n;i++)
     {
         if(ans[i]) printf("%dw",i);
         else printf("%dh",i);
         if(i<n-1) putchar(' ');
         else puts("");
     }
 }
 
 int main()
 {
     while(scanf("%d%d",&n,&m),n||m)
     {
         memset(head,-1,sizeof(head));
         e=0;
         int i,u,v;
         Add(2*n,0);
         Add(n,3*n);
         for(i=1;i<n;i++)
         {
             Add(i,i+3*n);
             Add(i+2*n,i+n);
             Add(i+n,i+2*n);
             Add(i+3*n,i);
         }
         char c1,c2;
         for(i=1;i<=m;i++)
         {
             scanf("%d%c%d%c",&u,&c1,&v,&c2);
             if(c1=='h') u+=n;
             if(c2=='h') v+=n;
             Add(u+2*n,v);
             Add(v+2*n,u);
         }
         deal();
     }
     return 0;
 }

  

 

 

相关文章:

  • topcoder srm 460 div1
  • ssh-agent
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 基于原型链劫持的前端代码插桩实践
  • Java动态代理机制——那些让你面试脱颖而出的技能 推荐
  • python正则表达式的使用
  • Nginx配置SSL实现服务器/客户端双向认证
  • reqeusts用法
  • 【总结整理】交互心理学---摘自《人人都是产品经理》
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 在线uml软件,在线思维导图软件
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • 楚留香mv
  • TestDriven.NET和Visual Studio Express的纠纷往事
  • 19.分屏查看命令 more命令
  • 深入了解以太坊
  • CSS实用技巧
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • EOS是什么
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Lucene解析 - 基本概念
  • Netty源码解析1-Buffer
  • SQLServer插入数据
  • 大快搜索数据爬虫技术实例安装教学篇
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 构造函数(constructor)与原型链(prototype)关系
  • 京东美团研发面经
  • 开发基于以太坊智能合约的DApp
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 面试遇到的一些题
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小李飞刀:SQL题目刷起来!
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​TypeScript都不会用,也敢说会前端?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • ${ }的特别功能
  • (2)STM32单片机上位机
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (k8s中)docker netty OOM问题记录
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (八)Flask之app.route装饰器函数的参数
  • (超详细)语音信号处理之特征提取
  • (多级缓存)多级缓存
  • (二)WCF的Binding模型
  • (六)激光线扫描-三维重建
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .NET 表达式计算:Expression Evaluator
  • .net 获取url的方法
  • .Net 路由处理厉害了