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. WP8.1 侧边滑动Item

    效果图 我看ios 和安卓上有好多类似的Item的效果,UWP上有微软官方的库,其中也有类似得效果,看样子WP8.1没有啊,顺便我的程序也是需要,我也就仿了一个. 具体思路是: 触摸控制GRId在CA ...

  2. Spring操作指南-针对JDBC配置声明式事务管理(基于XML)

  3. SpringMVC Controller 介绍

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  4. Jenkins

    http://www.cnblogs.com/chowmin/category/598634.html

  5. svg学习(九)path

    <path> 标签用来定义路径. 下面的命令可用于路径数据: M = moveto L = lineto H = horizontal lineto V = vertical lineto ...

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

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

  7. noi 1.5 45:金币

    描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...

  8. 总结ThinkPHP使用技巧经验分享(二)

    循环输出volist 还有别名 iterate 模版赋值:$User = D('User')$list = $User->findAll()$this->assign('list',$li ...

  9. aliyun阿里云Maven仓库地址

    <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...

  10. 夺命雷公狗-----React---19--表单的值的修改

    少了1个e,在代码部分补回,否则会报错 <!DOCTYPE> <html> <head> <meta charset="utf-8"> ...