2-ST是一种巧妙的建图模式。。。。其实,主要是将互相限制的条件转化为有向图。实现时,将每个点拆成两点,对应这个点的两种取值,然后求强连通分量。由于每个点只能有一种取值,所以若强连通分量中某一个点拆成的两个点在同一个强连通分量中则问题无解。那么,如果问题有解,怎么得到问题的解呢?首先是根据计算出的强连通分量重新构图,构图时逆向构图,然后在新图上拓扑排序就能得到一组解。。。

 struct node
 {
     int v,next;
 };

 //每个点u拆成2*u和2*u+1
 //若有解,一组解存在ans中[0,n-1]
 ;
 node edges[];
 int head[MAX],dfn[MAX],low[MAX],visit[MAX],color[MAX];
 int in[MAX],col[MAX],map[MAX][MAX],conflict[MAX];
 int n,m,e,index,cnt;
 stack<int> S;
 int ans[MAX];

 void Add(int u,int v)
 {
     edges[e].v=v;
     edges[e].next=head[u];
     head[u]=e++;
 }

 void Tarjan(int u)
 {
     int i,v;

     low[u]=dfn[u]=++index;S.push(u);visit[u]=;
     ;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]=;
             color[v]=cnt;
         }while(u!=v);
     }
 }

 void Build()
 {
     int i,u,v;

     memset(map,,sizeof(map));
     memset(,sizeof(in));
     ;u<*n;u++) ;i=edges[i].next)
     {
         v=edges[i].v;

         //逆向拓扑
         ;
     }
     ;u<=cnt;u++) ;v<=cnt;v++) if(map[u][v])
         in[v]++;
 }

 void Topsort()
 {
     int i,u,v;

     memset(col,,sizeof(col));
     while(!S.empty()) S.pop();
     ;i<=cnt;i++) if(!in[i]) S.push(i);
     while(!S.empty())
     {
         u=S.top();
         S.pop();
         ,col[conflict[u]]=;
         ;v<=cnt;v++) )
             S.push(v);
     }
 }

 void Cal()
 {
     int i;
     ;i<*n;i+=)
     {
         ]]) ans[i/]=i;
         ]=i+;
     }
 }

 int TWO_ST()
 {
     int i;

     memset(dfn,,sizeof(dfn));
     memset(visit,,sizeof(visit));
     index=cnt=;
     while(!S.empty()) S.pop();
     ;i<*n;i++) if(!dfn[i]) Tarjan(i);

     ;i<n;i++)
     {
         *i]==color[*i+]) ;
         conflict[color[*i]]=color[*i+];
         conflict[color[*i+]]=color[*i];
     }

     Build();
     Topsort();
     Cal();
     ;
 }
   

2-st学习笔记的更多相关文章

  1. Android学习笔记(八)——四种基本布局

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,或是嵌套子布局,从而编写出精美的界 ...

  2. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  3. CUBRID学习笔记 45 REPLACE DELETE MERGE 教程

    c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 ------ 官方文档是英文的, ...

  4. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  5. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  6. Android(java)学习笔记71:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...

  7. HMM的学习笔记1:前向算法

    HMM的学习笔记 HMM是关于时序的概率模型.描写叙述由一个隐藏的马尔科夫链随机生成不可观測的状态随机序列,再由各个状态生成不可观測的状态随机序列,再由各个状态生成一个观測而产生观測的随机过程. HM ...

  8. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  9. AU3学习笔记

    目录 1. AU3是什么?能做什么? 2. 乱学AU3中的命令(语言相关)? 3. 通过简单示例学习AU3? 4. 正则表达式的学习(对大小写敏感) 5.对于GUI的相关学习 1.        AU ...

  10. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

随机推荐

  1. jQuery工具函数(转)

    原文地址:http://www.cnblogs.com/kissdodog/archive/2012/12/27/2835561.html 作者:逆心 ------------------------ ...

  2. 安装eclipse的hadoop开发环境--2

    在eclipse上做好一切,在网上很容易搜到 尝试链接hadoop集群失败,尝试单机的操作,发现# ssh localhost失败 解决ssh问题:成功解决 但是eclipse的DFS locatio ...

  3. JAVA:通过poi读取excel

    POI是一个apache开源的jar包,可以通过搜索 java POI找到官网,并下载开发包. 包含的功能: 可以读取excel2003,2007,2010等. 读取excel2007/2010的代码 ...

  4. 一个关于Random算法的问题

    指定范围数字,生成随机序列,数字不连续:例如:范围[1-5]  输入 1 3 5 2 4 下面分享两种算法: 算法1:RmNum<RmNext 下面这种算法计算是无压力的 /// <sum ...

  5. 解决checkbox的attr(checked)一直为undefined问题

    需要做个一个全选的checkbox功能,遇到checkbox的attr("checked")一直为undefined,下面与大家分享下最终的解决方案   最近本屌丝应项目开发需求, ...

  6. struts 文件下载

    =============================struts 文件下载  ================================== 步骤一: JSP页面 <a href=& ...

  7. python直接执行另一个文件中的代码

    看你弄的这么辛苦,给你的方法exec(open(".py","r").read)open(".py",'r').read() 就是读取文件的 ...

  8. GPT WIN 换硬盘 硬盘克隆或复制 无法确定的问题,硬盘大小不一致换系统。

    当你购买了一个新硬盘,希望换掉旧硬盘的时候.发现 GPT + EFI 要求硬盘上的前两个分区必须和旧的一样,否则就无法启动. 这就是你用 分区大师(PartAssist)硬盘克隆完了,也无法启动的原因 ...

  9. YbSoftwareFactory 代码生成插件【二十】:DynamicObject的序列化

    DynamicObject 是 .NET 4.0以来才支持的一个类,但该类在.NET 4.0下未被标记为[Serializable] Attribute,而在.NET 4.5下则被标记了[Serial ...

  10. Android例子源码非第三方实现根据字母排序的城市列表

    values 下dimens.xml <resources> <!-- Default screen margins, per the Android Design guidelin ...