娄底网站建设的公司,济宁检出阳性259人,Pc端做社区网站用什么框架,北京厦门网站优化概述
按照事先约定的优先级#xff0c;可以始终高效查找并访问优先级最高数据项的数据结构#xff0c;也统称作优先级队列
优先级队列将操作对象限定于当前的全局极值者。
根据数据对象之间相对优先级对其进行访问的方式#xff0c;与此前的访问方式有着本质区别#xf…概述
按照事先约定的优先级可以始终高效查找并访问优先级最高数据项的数据结构也统称作优先级队列
优先级队列将操作对象限定于当前的全局极值者。
根据数据对象之间相对优先级对其进行访问的方式与此前的访问方式有着本质区别称作 循优先级访问 (call-by-priority)。
“全局极值”本身就隐含了“所有元素可相互比较”这一性质。然而优先级队列并不一定需要动态维护这个全序却转而维护一个偏序partial order关系。 因此优先级队列不仅足以高效地支持仅针对极值对象的接口操作更可有效地控制整体计算成本。
词条entry优先级队列中的数据项 关键码key与特定优先级相对应的数据属性 作为确定词条优先级的依据关键码之间必须可以比较大小.
基本实现
优先级队列作为一类独特数据结构的意义在于通过转而维护词条集的一个偏序关系。
操作接口
操作结构功能描述size()报告优先级队列的规模即其中词条的总数insert()将指定词条插入优先级队列getMax()返回优先级最大的词条若优先级队列非空delMax()删除优先级最大的词条若优先级队列非空
接口定义
template typename T struct PQ { // 优先级队列 PQ 模板类virtual void insert ( T ) ; // 按照比较器确定的优先级次序插入词条virtual T getMax() ; // 取出优先级最高的词条virtual T delMax() ; // 删除优先级最高的词条
}因为这一组基本的ADT接口可能有不同的实现方式故这里均以虚函数形式统一描述这些接口以便在不同的派生类中具体实现。 借助无序列表、有序列表、无序向量或有序向量都难以同时兼顾insert()和delMax()操作的高效率。
完全二叉堆结构
结构性 逻辑结构须等同于完全二叉树如此堆节点将与词条一一对应 堆序性 优先级而言堆顶以外的每个节点都不高大于其父节点
堆中优先级最高的词条必然始终处于堆顶位置。因此堆结构的getMax()操作总是可以在O(1)时间内完成。 堆顶以外的每个节点都不低小于其父节点。 结构等同于完全二叉树n 个词条组成的堆的高度 h ⌊ log 2 n ⌋ O ( l o g n ) h \lfloor \log_2 n \rfloor \cal O(logn) h⌊log2n⌋O(logn)。 insert()和delMax()操作的时间复杂度将线性正比于堆的高度h故它们均可在O(logn)的时间内完成。
完全二叉堆的拓扑联接结构完全由其规模n确定。节点在物理上连续排列故总共仅需O(n)空间而且利用各节点的编号或秩也可便捷地判别父子关系。
实现
#include ../Vector/Vector.h //借助多重继承机制基于向量
#include ../PQ/PQ.h //按照优先级队列ADT实现的
template typename T class PO ComplHeap : public POT, public VectorT[ //完全二又堆
protected:Rank percolateDown ( Rank nRank i ); //下滤Rank percolateUp ( Rank i ); //上滤void heapify ( Rank n ); //Floyd建堆算法
public:PQ_ComplHeap()[}//默认构造PQ_ComplHeap ( T* A, Rank n )[ copyFrom ( A,,n ); heapify ( n );} //批量构造void insert ( T );//按照比较器确定的优先级次序插入词条T getMax();//读取优先级最高的词条T delMax(); //删除优先级最高的词条}; //PO CompIHeap全局优先级最高的词条总是位于堆顶只需返回向量的首单元即可在O(1)时间内完成getMax()操作。
templatetypename T Y PQ_ComplHeapT::getMax() {return _elem[0]; //取优先级最高的词条完全二叉堆插入与上滤
插入算法分为两个步骤1. 首先将新词条接至向量末尾 2.再对该词条实施上滤调整。
template typename T void PQ_ComplHeapT::insert (Te){ //将词条插入完全二叉堆中VectorT::insert ( e ); //首先将新词条接至向量未尾percolateUp ( _size - 1 ); //再对该词条实施上滤调整
}尽管此时如图(a)所示新词条的引入并未破坏堆的结构性但只要新词条e不是堆顶就有可能与其父亲违反堆序性。所以需要对新接入的词条做适当调整在保持结构性的前提下恢复整体的堆序性。
上滤
假定原堆非空于是新词条e的父亲p深色节点必然存在。 根据e在向量中对应的秩可以简便地确定词条p对应的秩即 i ( p ) ⌈ i ( e ) − 1 ) ⌉ i(p) \lceil i(e) - 1) \rceil i(p)⌈i(e)−1)⌉ 。 若经比较判定 e ≤ p e \leq p e≤p则堆序性在此局部以至全堆均已满足插入操作因此即告完成。反之若 e p e p ep则可在向量中令 e 和 p 互换位置。如图(b)所示如此不仅全堆的结构性依然满足而且e和p之间的堆序性也得以恢复。 当然此后e与其新的父亲可能再次违背堆序性。若果真如此继续套用以上方法如图( c)所示令二者交换位置。
每交换一次新词条e都向上攀升一层故这一过程也形象地称作上滤percolate up。一旦上滤完成则如图(d)所示全堆的堆序性必将恢复。
//对向量中的第i个词条实施上滤操作i _size
template typename T Rank PQ ComplHeapT::percolateUp ( Rank i ){while ( ParentValid ( i ) ) //只要i有父亲( 尚未抵达堆顶)则Rank j Parent (i); //将i之父记作jif ( lt ( _elem[i], _elem[j] ) ) break; //一旦当前父子不再逆序上滤旋即完成swap ( _elem[i], _elem[j] );i j; //否则父子交换位置并继续考查上一层}//whilereturn i; //返回上滤最终抵达的位置
}上滤调整过程中交换操作的累计次数不致超过全堆的高度 log2 n。而在向量中每次交换操作只需常数时间故上滤调整乃至整个词条插入算法整体的时间复杂度均为 O(logn)。
实例 在如图(a)所示由5个元素组成的初始完全堆中现拟插入关键码为5的新元素。为此首先如图(b)所示将该元素置于向量的末尾。此时新元素5与其父节点0逆序故如图©所示经一次交换之后新元素5上升一层。此后新元素5与其新的父节点4依然逆序故如图(d)所示经一次交换后再上升一层。此时因已抵达堆顶插入操作完毕故算法终止。
//对向量中的第i个词条实施上滤操作i _size
template typename T Rank PQ_ComplHeapT :: percolateUp ( Rank i ) {while ( Parentvalid ( i ) ) { //只要i有父亲(尚未抵达堆顶则Rank j Parent ( i ); //将i之父记作jif ( lt ( _elem[i]_elem[j] ) ) break; //一旦当前父子不再逆序上滤旋即完成swap (_elem[i]_elem[j]); i j; //否则父子交换位置并继续考查上一层} //whilereturn i; //返回上滤最终抵达的位置
}完全二叉堆删除与下滤
删除算法也分为两个步骤1.待删除词条r总是位于堆顶可直接将其取出并备份2.摘除堆顶首词条)代之以末词条对新堆顶实施下滤将最末尾的词条e转移至堆顶。
template typename T T PQ_ComplHeapT::delMax() { //删除非空完全二叉堆中优先级最高的词条T maxElem _elem[0]; _elem[0] _elem[ --_size ]; //摘除堆顶首词条代之以末词条percolateDown ( _size, 0 ); //对新堆顶实施下滤
return maxElem; //返回此前备份的最大词条实例
若新堆顶e不满足堆序性则可如图(c )所示将e与其(至多)两个孩子中的大者(图中深色节点交换位置。与上滤一样由于使用了向量来实现堆根据词条e的秩可便捷地确定其孩子的秩。 此后堆中可能的缺陷依然只能来自于词条e——它与新孩子可能再次违背堆序性。若果真如此继续套用以上方法将e与新孩子中的大者交换结果如图(d)所示。实际上只要有必要此后可如图(e)和(f)不断重复这种交换操作。
因每经过一次交换词条e都会下降一层故这一调整过程也称作下滤percolate down。 下滤乃至整个删除算法的时间复杂度也为O(logn)
//对向量前 n 个词条中的第 i 个实施下滤i n
template typename T Rank PQ_ComplHeapT :: percolateDown ( Rank nRank i ) {Rank j; //i及其(至多两个)孩子中堪为父者while ( i ! ( j ProperParent ( _elemn, i ) )) //只要 i 非 j则{ swap ( _elem[i]_elem[j] ); i j; } //二者换位并继续考查下降后的 ireturn i; //返回下滤抵达的位置(亦 i 亦 j)
}完全二叉堆批量建堆
建堆给定一组词条高效地将它们组织成一个堆。
蛮力算法
从空堆起反复调用标准insert()接口即可将输入词条逐一插入其中并最终完成建堆任务。 具体地若共有n个词条则共需迭代n次。第k轮迭代耗时O(logk)故累计耗时间量应为O(log1 log2 ... logn) O(logn!) O(nlogn)。
自上而下的上滤对任何一棵完全二叉树只需自顶而下、自左向右地针对其中每个节点实施一次上滤即可使之成为完全二叉堆。在此过程中为将每个节点纳入堆中所需消耗的时间量将线性正比于该节点的深度O(nlogn)。
Floyd 算法
任给堆 H 0 H_0 H0 和 H 1 H_1 H1 以及另一独立节点 p p p 如何高效地将 H 0 ∪ { P } ∪ H 1 H_0 \cup \{P\} \cup H_1 H0∪{P}∪H1 转化为堆 首先为满足结构性可将这两个堆当作 p p p 的左、右子树联接成一棵完整的二叉树。此时若 p p p 与孩子 r 0 r_0 r0 和 r 1 r_1 r1 满足堆序性则该二叉树已经就是一个不折不扣的堆。 此时的场景完全等效于在delMax()操作中摘除堆顶再将末位词条 ( p ) (p) (p) 转移至堆顶。 自底而上地反复套用可不断地将处于下层的堆捉对地合并成更高一层的堆并最终得到一个完整的堆。 按照这一构思即可实现 Floyd 建堆算法
template typename T void PQ_ComplHeapT::heapify ( Rank n ) { //Floyd建堆算法O(n)时间for ( int i LastInternal ( n ); InHeap ( n, i ); i-- ) //自底而上依次percolateDown ( n, i ); //下滤各内部节点
}只需自下而上、由深而浅地遍历所有内部节点并对每个内部节点分别调用一次下滤算法percolateDown()。
实例 复杂度 算法依然需做n步迭代以对所有节点各做一次下滤。这里每个节点的下滤所需的时间线性正比于其高度故总体运行时间取决于各节点的高度总和。
不妨仍以高度为h、规模为 n 2 h 1 − 1 n 2^{h1} - 1 n2h1−1 的满二叉树为例做一大致估计运行时间应为O(n)。 由于在遍历所有词条之前绝不可能确定堆的结构故以上已是建堆操作的最优算法。 各节点所消耗的时间线性正比于其深度——而在完全二叉树中深度小的节点远远少于高度小的节点。
堆排序
堆排序算法 对于向量中的 n 个词条借助堆的相关算法实现高效的排序。 将所有词条分成未排序和已排序两类不断从前一类中取出最大者顺序加至后一类中。算法启动之初所有词条均属于前 一类此后后一类不断增长当所有词条都已转入后一类时即完成排序。
将其划分为前缀H和与之互补的后缀S分别对应于上述未排序和已排序部分。 与常规选择排序算法一样在算法启动之初H覆盖所有词条而S为空。新算法的不同之处在于整个排序过程中无论H包含多少词条始终都组织为一个堆。 H中的最大词条不会大于S中的最小词条——除非二者之一为空比如算法的初始和终止时刻。 首先如图(a)取出首单元词条M将其与末单元词条x交换。M既是当前堆中的最大者同时根据不变性也不大于S中的任何词条故如此交换之后M必处于正确的排序位置。 如图(b)此时可等效地认为S向前扩大了一个单元H相应地缩小了一个单元。请注意如此重新分界之后的H和S依然满足以上不变性。至此,唯一尚未解决的问题是词条x通常不能“胜任”堆顶的角色。 最后如图(c )对X实施一次下滤调整即可使H整体的堆序性重新恢复。
复杂度 在每一步迭代中交换M和X只需常数时间对x的下滤调整不超过O(logn)时间。因此全部n步迭代累计耗时不超过O(nlogn)。即便使用蛮力算法而不是Floyd算法来完成H的初始化整个算法的运行时间也不超过O(nlogn)。
实现
template ctypename T〉 void VectorT::heapSort ( Rank loRank hi ) { //0 lo hi 〈 sizePQ_ComplHeapT H ( _elem lo , hi - lo ); //将待排序区间建成一个完全二叉堆O(n)while ( !H.empty() ) //反复地摘除最大元并归入已排序的后缀直至堆空_elem[--hi] H.delMax( ); //等效于堆顶与末元素对换后下滤
}左式堆结构
堆合并任给堆A和堆B将二者所含的词条组织为一个堆。
简单方法1反复取出堆 B 的最大词条并插入堆 A 中当堆 B 为空时堆 A 即为所需的堆 H。
while ( ! B.empty() )A.insert( B.delMax() );将两个堆的规模分别记作 n n n 和 m m m 且 n ≥ m n \geq m n≥m。每一步迭代均需做一次删除操作和一次插入操作分别耗时 O ( log m ) \mathcal O(\log m) O(logm) 和 O ( log ( n m ) ) \mathcal O(\log(n m)) O(log(nm))。因共需做 m m m 步迭代故总体运行时间应为 m × [ O ( log m ) O ( log ( n m ) ) ] O ( m log ( n m ) ) O ( m log n ) m \times [ \mathcal O( \log m) \mathcal O(\log (n m))] \mathcal O(m \log(n m)) \mathcal O(m \log n) m×[O(logm)O(log(nm))]O(mlog(nm))O(mlogn)
简单方法2将两个堆中的词条视作彼此独立的对象从而可以直接借助 Floyd 算法将它们组织为一个新的堆 H。该方法的运行时间应为 O ( n m ) O ( n ) \mathcal O(n m) \mathcal O(n) O(nm)O(n).
左式堆leftist heap是优先级队列的另一实现方式可高效地支持堆合并操作。 基本思路在保持堆序性的前提下附加新的条件使得在堆的合并过程中只需调整很少量的节点。 具体地需参与调整的节点不超过O(logn)个故可达到极高的效率。 左式堆的整体结构呈单侧倾斜状依照惯例其中节点的分布均偏向左侧。也就是说左式堆将不再如完全二叉堆那样满足结构性。
#include ../PQ/PQ.h //引入优先级队列ADT
#include ../BinTree/BinTree.h //引入二叉树节点模板类
template typename T
class PQ_LeftHeap : public PQT, public BinTreeT{ //基于二叉树以左式堆形式实现的PQ
public:PO_LeftHeap() { }//默认构造Po_LeftHeap ( T* E, int n ) //批量构造:可改进为Floyd建堆算法{ for ( int i 0; i n; i ) insert (E[i]); }void insert ( T ); //按照比较器确定的优先级次序插入元素T getMax(); //取出优先级最高的元素T delMax(); //删除优先级最高的元素
}; //Po_LeftHeapPQ_LeftHeap首先继承了优先级队列对外的标准ADT接口。另外既然左式堆的逻辑结构已不再等价于完全二叉树改用紧凑性稍差、灵活性更强的二叉树结构将更具针对性。其中蛮力式批量构造方法耗时O(nlogn)利用Floyd算法可改进至O(n)。
空节点路径长度
节点x的空节点路径长度null path length记作npl(x)。若x为外部节点则约定npl(x) npl(null) 0。反之若x为内部节点则npl(x)可递归地定义为npl(x) 1 min( npl(lc(x)), npl(rc(x)) )。 节点x的npl值取决于其左、右孩子npl值中的小者。 npl(x)既等于x到外部节点的最近距离同时也等于以x为根的最大满子树的高度。
左倾性与左式堆
左式堆是处处满足“左倾性”的二叉堆即任一内部节点x都满足 npl ( l c ( x ) ) ≥ npl ( r c ( x ) ) \text{npl}(lc(x)) \geq \text{npl}(rc(x)) npl(lc(x))≥npl(rc(x)) 左式堆左孩子的npl值不小于右孩子而前者的高度却可能小于后者。
左式堆中任一内节点x都应满足npl(x) 1 npl(rc(x)) 左式堆中每个节点的npl值仅取决于其右孩子。
最右侧通路
从x出发沿右侧分支一直前行直至空节点经过的通路称作其最右侧通路记作rPath(x)。 每个节点的npl值应恰好等于其最右侧通路的长度。
rPath(r)的终点必为全堆中深度最小的外部节点。 若记 n p l ( r ) ∣ r P a t h ( r ) ∣ d npl(r) |rPath(r)| d npl(r)∣rPath(r)∣d则该堆应包含一棵以 r r r 为根、高度为 d d d 的满二叉树黑色部分且该满二叉树至少应包含 2 d 1 − 1 2^{d1} -1 2d1−1 个节点、 2 d − 1 个 2^d - 1个 2d−1个 内部节点——这也是堆的规模下限。反之在包含 n n n 个节点的左式堆中最右侧通路必然不会长于log2(n1)-1 O(logn)。
左式堆合并算法 递归地将 a a a 的右子堆 a R a_R aR 与堆 b b b合并然后作为节点 a a a 的右孩子替换原先的 a R a_R aR。最后比较a左、右孩子的 npl 值——如有必要还需将二者交换以保证左孩子的 npl 值不低于右孩子。
实现
template typename T //根据相对优先级确定适宜的方式合并以a和b为根节点的两个左式堆
static BinNodePosi(T) merge ( BinNodePosi(T) aBinNodePosi(T) b ) {if ( ! a ) return b;//退化情况if ( ! b ) return a;//退化情况if ( lt ( a-datab-data ) ) swap ( a, b );//一般情况∶首先确保b不大a-rc merge ( a-rc, b ); //将a的右子堆与 b 合并a-rc-parent a;//并更新父子关系if ( !a-lc || a-lc-npl a-rc-npl ) //若有必要swap ( a-lca-rc ); //交换a的左、右子堆以确保右子堆的npl不大a-npl a-rc ? a-rc-npl 1 : 1; //更新a的nplreturn a;//返回合并后的堆顶
} //算法只实现结构上的合并首先判断并处理待合并子堆为空的平凡情况。然后再通过一次比较以及在必要时所做的一次交换以保证堆顶a的优先级总是不低于另一堆顶b。 递归地将a的右子堆与堆b合并并作为a的右子堆重新接入。递归返回之后还需比较此时a左、右孩子的npl值如有必要还需令其互换以保证前者不小于后者。此后只需在右孩子npl值的基础上加一即可得到堆顶a的新npl值。至此合并方告完成。
复杂度 递归只可能发生于两个待合并堆的最右侧通路上。 若待合并堆的规模分别为n和m则其两条最右侧通路的长度分别不会超过O(logn)和O(logm)因此合并算法总体运行时间应不超过O(logn) O(logm) O( logn logm ) O(log(max(n, m)))
左式堆插入和删除
基于堆合并操作实现删除接口 在摘除x之后HL 和HR 即可被视作为两个彼此独立的待合并的堆。 于是只要通过merge()操作将它们合并起来则其效果完全等同于一次常规的delMax()删除操作。
template typename T T PQ_LeftHeapT::delMax(){ //基于合并操作的词条删除算法当前队列非空)BinNodePosi(T) lHeap _root-lc; //左子堆BinNodePosi(T) rHeap _root-rc; //右子堆T e _root-data; delete _root; _size--; //删除根节点_root merge ( lHeaprHeap ); //原左右子堆合并if ( _root ) _root-parent NULL;//若堆非空还需相应设置父子链接return e;//返回原根节点的数据项
}时间成本主要消耗于对merge()的调用总体依然不超过O(logn)。
基于堆合并操作实现词条插入算法 只要将x也视作仅含单个节点的堆则通过调用merge()操作将该堆与堆H合并之后其效果即完全等同于完成了一次词条插入操作。
template typename T void PQ_LeftHeapT::insert ( T e ) { //基于合并操作的词条插入算法BinNodePosi(T) v new BinNodeT ( e ); //为e创建一个二叉树节点_root merge ( _root,v ); //通过合并完成新节点的插入_root-parent NULL; //既然此时堆非空还需相应设置父子链接_size; //更新规模
}时间成本主要也是消耗于对merge()的调用总体依然不超过O(logn) 文章转载自: http://www.morning.xmttd.cn.gov.cn.xmttd.cn http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn http://www.morning.c7629.cn.gov.cn.c7629.cn http://www.morning.fyzsq.cn.gov.cn.fyzsq.cn http://www.morning.mqlsf.cn.gov.cn.mqlsf.cn http://www.morning.trffl.cn.gov.cn.trffl.cn http://www.morning.pfggj.cn.gov.cn.pfggj.cn http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn http://www.morning.rrxmm.cn.gov.cn.rrxmm.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.rhdln.cn.gov.cn.rhdln.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.znqmh.cn.gov.cn.znqmh.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.kwblwbl.cn.gov.cn.kwblwbl.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.tnhg.cn.gov.cn.tnhg.cn http://www.morning.cplym.cn.gov.cn.cplym.cn http://www.morning.jglqn.cn.gov.cn.jglqn.cn http://www.morning.ryysc.cn.gov.cn.ryysc.cn http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn http://www.morning.dsxgc.cn.gov.cn.dsxgc.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.rnwt.cn.gov.cn.rnwt.cn http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn http://www.morning.tqklh.cn.gov.cn.tqklh.cn http://www.morning.xnymt.cn.gov.cn.xnymt.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.rgsgk.cn.gov.cn.rgsgk.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.rdfq.cn.gov.cn.rdfq.cn http://www.morning.fddfn.cn.gov.cn.fddfn.cn http://www.morning.dshkp.cn.gov.cn.dshkp.cn http://www.morning.synlt.cn.gov.cn.synlt.cn http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn http://www.morning.bmsqq.cn.gov.cn.bmsqq.cn http://www.morning.rbbyd.cn.gov.cn.rbbyd.cn http://www.morning.ppqzb.cn.gov.cn.ppqzb.cn http://www.morning.kngx.cn.gov.cn.kngx.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.bfhrj.cn.gov.cn.bfhrj.cn http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn http://www.morning.wjlnz.cn.gov.cn.wjlnz.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.thlzt.cn.gov.cn.thlzt.cn http://www.morning.tbqbd.cn.gov.cn.tbqbd.cn http://www.morning.cpktd.cn.gov.cn.cpktd.cn http://www.morning.gwkwt.cn.gov.cn.gwkwt.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.wmsgt.cn.gov.cn.wmsgt.cn http://www.morning.xhkgl.cn.gov.cn.xhkgl.cn http://www.morning.dfkmz.cn.gov.cn.dfkmz.cn http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn http://www.morning.rglzy.cn.gov.cn.rglzy.cn http://www.morning.mrqwy.cn.gov.cn.mrqwy.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn http://www.morning.stfdh.cn.gov.cn.stfdh.cn http://www.morning.mqghs.cn.gov.cn.mqghs.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.rrgqq.cn.gov.cn.rrgqq.cn http://www.morning.mnwsy.cn.gov.cn.mnwsy.cn http://www.morning.rcmcw.cn.gov.cn.rcmcw.cn http://www.morning.mltsc.cn.gov.cn.mltsc.cn