问答系统网站模板,仿站网站建设,禅城教育网站建站,做网站为什么要服务器#x1f525;个人主页#xff1a;Quitecoder 
#x1f525;专栏#xff1a;c笔记仓 目录 01.并查集02.图的介绍03.图的存储结构03.1.邻接矩阵03.2.邻接表03.3.矩阵版本代码实现03.4.邻接表版本代码实现 完整代码#xff1a; 01.并查集 在一些应用问题中#xff0c;需要将… 
个人主页Quitecoder 
专栏c笔记仓 目录 01.并查集02.图的介绍03.图的存储结构03.1.邻接矩阵03.2.邻接表03.3.矩阵版本代码实现03.4.邻接表版本代码实现 完整代码 01.并查集 在一些应用问题中需要将n个不同的元素划分成一些不相交的集合。开始时每个元素自成一个单元素集合然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set) 比如某公司今年校招全国总共招生10人西安招4人成都招3人武汉招3人10个人来自不同的学校起先互不相识每个学生都是一个独立的小团体现给这些学生进行编号{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 给以下数组用来存储该小集体数组中的数字代表该小集体中具有成员的个数 毕业后学生们要去公司上班每个地方的学生自发组织成小分队一起上路于是 西安学生小分队s1{0,6,7,8}成都学生小分队s2{1,4,9}武汉学生小分队s3{2,3,5}就相互认识了10个人形成了三个小团体。假设右三个群主0,1,2担任队长负责大家的出行。 从上图可以看出编号6,7,8同学属于0号小分队该小分队中有4人(包含队长0)编号为4和9的同学属于1号小分队该小分队有3人(包含队长1)编号为3和5的同学属于2号小分队该小分队有3个人(包含队长1) 
仔细观察数组中内融化可以得出以下结论 
数组的下标对应集合中元素的编号数组中如果为负数负号代表根数字代表该集合中元素个数数组中如果为非负数代表该元素双亲在数组中的下标 
在公司工作一段时间后西安小分队中8号同学与成都小分队1号同学奇迹般的走到了一起两个小圈子的学生相互介绍最后成为了一个小圈子 现在0集合有7个人2集合有3个人总共两个朋友圈 
通过以上例子可知并查集一般可以解决一下问题 
查找元素属于哪个集合 沿着数组表示树形关系以上一直找到根(即树中中元素为负数的位置)查看两个元素是否属于同一个集合 沿着数组表示的树形关系往上一直找到树的根如果根相同表明在同一个集合否则不在将两个集合归并成一个集合 将两个集合中的元素合并 将一个集合名称改成另一个集合的名称集合的个数 遍历数组数组中元素为负数的个数即为集合的个数 
代码实现 
class UnionFindSet
{
public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){int root1  FindRoot(x1);int root2  FindRoot(x2);if (root1  root2)return;_ufs[root1]  _ufs[root2];_ufs[root2]  root1;}int FindRoot(int x){int parent  x;while (_ufs[parent]  0){parent  _ufs[parent];}return parent;}bool InSet(int x1,int x2){return FindRoot(x1)  FindRoot(x2);}size_t SetSize(){size_t size 0;for (int i  0; i  _ufs.size(); i){if (_ufs[i]  0) size;}return size;}
private:vectorint _ufs;
};题目链接1LCR 116. 省份数量 题目描述 class Solution {
public:   int findCircleNum(vectorvectorint isConnected) {UnionFindSet ufs(isConnected.size());for(int i0;iisConnected.size();i){for(int j0;jisConnected[i].size();j){if(isConnected[i][j]1){ufs.Union(i,j);}}}return ufs.SetSize();}
};题目链接2990. 等式方程的可满足性 题目描述 class Solution {
public:bool equationsPossible(vectorstring equations) {UnionFindSet _ufs(26);for(auto str: equations){if(str[1]){_ufs.Union(str[0]-a,str[3]-a);}}for(auto str2: equations){if(str2[1]!){if(_ufs.InSet(str2[0]-a,str2[3]-a)) return false;}}return true;}
};02.图的介绍 
并查集是后面的铺垫这里我们对图进行讲解 
图是由顶点集合及顶点间的关系组成的一种数据结构G  (V E)其中顶点集合V  {x|x属于某个数据对象集}是有穷非空集合 
E  {(x,y)|x,y属于V}或者E  {x, y|x,y属于V  Path(x, y)}是顶点间关系的有穷集合也叫做边的集合。(x, y)表示x到y的一条双向通路即(x, y)是无方向的Path(x, y)表示从x到y的一条单向通路即Path(x, y)是有方向的 顶点和边图中结点称为顶点第i个顶点记作vi。两个顶点vi和vj相关联称作顶点vi和顶点vj之间有一条边图中的第k条边记作ekek  (vivj)或vivj 有向图和无向图在有向图中顶点对x, y是有序的顶点对xy称为顶点x到顶点y的一条边(弧)x, y和y, x是两条不同的边比如图G3和G4为有向图。在无向图中顶点对(x, y)是无序的顶点对(x,y)称为顶点x和顶点y相关联的一条边这条边没有特定方向(x, y)和(yx)是同一条边比如图G1和G2为无向图。注意无向边(x, y)等于有向边x, y和y, x  完全图在有n个顶点的无向图中若有n * (n-1)/2条边即任意两个顶点之间有且仅有一条边则称此图为无向完全图**比如上图G1在n个顶点的有向图中若有n * (n-1)条边即任意两个顶点之间有且仅有方向相反的边则称此图为有向完全图比如上图G4任意两个顶点之间都相连最稠密的图  邻接顶点在无向图中G中若(u, v)是E(G)中的一条边则称u和v互为邻接顶点并称边(u,v)依附于顶点u和v在有向图G中若u, v是E(G)中的一条边则称顶点u邻接到v顶点v邻接自顶点u并称边u, v与顶点u和顶点v相关联  顶点的度顶点v的度是指与它相关联的边的条数记作deg(v)。在有向图中顶点的度等于该顶点的入度与出度之和其中顶点v的入度是以v为终点的有向边的条数记作indev(v);顶点v的出度是以v为起始点的有向边的条数记作outdev(v)。因此dev(v)  indev(v)  outdev(v)。注意对于无向图顶点的度等于该顶点的入度和出度即dev(v)  indev(v)  outdev(v)  路径在图G  (V E)中若从顶点vi出发有一组边使其可到达顶点vj则称顶点vi到顶点vj的顶点序列为从顶点vi到顶点vj的路径  路径长度对于不带权的图一条路径的路径长度是指该路径上的边的条数对于带权的图一条路径的路径长度是指该路径上各个边权值的总和   
简单路径与回路若路径上各顶点v1v2v3…vm均不重复则称这样的路径为简单路径。若路径上第一个顶点v1和最后一个顶点vm重合则称这样的路径为回路或环  子图设图G  {V, E}和图G1  {V1E1}若V1属于V且E1属于E则称G1是G的子图 连通图在无向图中若从顶点v1到顶点v2有路径则称顶点v1与顶点v2是连通的。如果图中任意一对顶点都是连通的则称此图为连通图。强连通图在有向图中若在每一对顶点vi和vj之间都存在一条从vi到vj的路径也存在一条从vj到vi的路径则称此图是强连通图。生成树一个连通图无向图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n-1条边。 
03.图的存储结构 
因为图中既有节点又有边(节点与节点之间的关系)因此在图的存储中只需要保存节点和边关系即可。节点保存比较简单只需要一段连续空间即可那边关系该怎么保存呢 
03.1.邻接矩阵 
因为节点与节点之间的关系就是连通与否即为0或者1因此邻接矩阵(二维数组)即是先用一个数组将定点保存然后采用矩阵来表示节点与节点之间的关系 无向图的邻接矩阵是对称的第i行(列)元素之和就是顶点i的度。有向图的邻接矩阵则不一定是对称的第i行(列)元素之和就是顶点i 的出(入)度 
如果边带有权值并且两个节点之间是连通的上图中的边的关系就用权值代替如果两个顶点不通则使用无穷大代替 邻接矩阵存储方式非常适合稠密图 邻接矩阵O(1)判断两个顶点的连接关系并取到权值 用邻接矩阵存储图的有点是能够快速知道两个顶点是否连通缺陷是如果顶点比较多边比较少时矩阵中存储了大量的0成为系数矩阵比较浪费空间并且要求两个节点之间的路径不是很好求同时也不好求一个顶点连接的边数 03.2.邻接表 
邻接表使用数组表示顶点的集合使用链表表示边的关系。 
无向图邻接表存储  指针数组自己连接顶点边全都挂在下面有向图邻接表存储  注意有向图中每条边在邻接表中只出现一次与顶点vi对应的邻接表所含结点的个数就是该顶点的出度也称出度表要得到vi顶点的入度必须检测其他所有顶点对应的边链表看有多少边顶点的dst取值是i。 
邻接表适合存储稀疏图也适合查找一个顶点连接出去的边不适合去确定两个顶点是否相连及权值 
03.3.矩阵版本代码实现 
templateclass V,class W, W MAX_W  INT_MAX,bool Direction  false
class Graph
{private:vectorV _vertexs;//顶点集合;mapV, int _indexMap;//顶点映射下标;vectorvectorW _matrix;// 存储边集合的矩阵
};构造函数 
Graph(const V* a,size_t n)
{_vertexs.reserve(n);for (size_t i  0; i  n; i){_vertexs.push_back(a[i]);_indexMap[a[i]]  i;}_matrix.resize(n);for (size_t i  0; i  _matrix.size(); i){_matrix[i].resize(n, MAX_W);}
}这是一个带顶点数组 a 和顶点数量 n 的构造函数作用是 
初始化图的顶点集合 _vertexs。使用一个映射 _indexMap 存储顶点到索引的映射关系方便后续操作。使用二维矩阵 _matrix 初始化边的权值集合 
_vertexs.reserve(n)为顶点集合预留容量避免后续动态扩展的开销。 
遍历顶点数组将每个顶点添加到 _vertexs并记录其在数组中的索引到 _indexMap实现顶点到索引的快速查找 
_matrix.resize(n)将矩阵调整为 n×n大小。 每行使用 resize(n, MAX_W) 将所有初始值设置为 MAX_W表示无连接边 
添加边 
size_t GetVertexIndex(const V v)
{auto it  _indexMap.find(v);if (it ! _indexMap.end()){return it-second;}else{throw invalid_argument(不存在的顶点);return -1;}
}
void AddEdge(const V src, const V dst, consy W w)
{size_t srci  GetVertexIndex(src);size_t dsti  GetVertexIndex(dst);_matrix[srci][dsti]  w; if (Direction  false){_matrix[dsti][srci]  w;}
}这段代码实现了两个关键功能 
GetVertexIndex 函数查找顶点的索引。AddEdge 函数在图中添加边支持有向图和无向图。 
实现逻辑 
使用 _indexMap.find(v) 在映射 _indexMap 中查找顶点 v。如果找到返回对应的索引 it-second。如果未找到抛出异常 invalid_argument(不存在的顶点)提示顶点不存在。 
在图中添加一条边支持有向图和无向图。 
输入参数 
const V src边的起点顶点。const V dst边的终点顶点。const W w边的权值引用方式传递避免复制。 
处理方向性 
有向图只设置 _matrix[srci][dsti]。无向图同时设置 _matrix[srci][dsti] 和 _matrix[dsti][srci]。 
打印函数 
void Print()
{// 打印顶点和下标映射关系for (size_t i  0; i  _vertexs.size(); i){cout  _vertexs[i]  -  i   ;}cout  endl  endl;cout    ;for (size_t i  0; i  _vertexs.size(); i){cout  i   ;}cout  endl;// 打印矩阵for (size_t i  0; i  _matrix.size(); i){cout  i   ;for (size_t j  0; j  _matrix[i].size(); j){if (_matrix[i][j] ! MAX_W)cout  _matrix[i][j]   ;elsecout  #   ;}cout  endl;}cout  endl  endl;// 打印所有的边for (size_t i  0; i  _matrix.size(); i){for (size_t j  0; j  _matrix[i].size(); j){if (i  j  _matrix[i][j] ! MAX_W){cout  _vertexs[i]  -  _vertexs[j]  : _matrix[i][j]  endl;}}}
}进行测试 03.4.邻接表版本代码实现 
templateclass W
struct LinkEdge
{int _srcindex;           // 边的起点索引int _dstindex;           // 边的终点索引W _w;                    // 边的权值LinkEdgeW* _next;      // 指向下一个边的指针用于链式存储LinkEdge(const W w): _srcIndex(-1)      // 默认起点索引为 -1, _dstIndex(-1)      // 默认终点索引为 -1, _w(w)              // 初始化权值, _next(nullptr)     // 指向下一个边的指针初始化为 nullptr{}
};
templateclass V, class W,  bool Direction  false
class Graph
{typedef LinkEdgeW Edge;
public:private:vectorV _vertexs;//顶点集合;mapV, int _indexMap;//顶点映射下标;vectorEdge* _tables;// 邻接表
};初始化 
Graph(const V* a, size_t n)
{_vertexs.reserve(n);for (size_t i  0; i  n; i){_vertexs.push_back(a[i]);_indexMap[a[i]]  i;}_tables.resize(n,nullptr);
}增加边 
void AddEdge(const V src, const V dst, const W w)
{size_t srci  GetVertexIndex(src);size_t dsti  GetVertexIndex(dst);Edge* sd_edge  new Edge(w);sd_edge-_srcindex  srci;sd_edge-_dstindex  dsti;sd_edge-_next  _tables[srci];_tables[srci]  sd_edge;if (Direction  false){Edge* ds_edge  new Edge(w);ds_edge-_srcIndex  dstindex;ds_edge-_dstIndex  srcindex;ds_edge-_next  _tables[dstindex];_tables[dstindex]  ds_edge;}
}下面是详细的步骤说明基于图中有四个顶点 ( A, B, C, D )。我们逐步构建它们的邻接表同时解释代码的详细逻辑。 假设 
图的顶点集合为[A, B, C, D]。图的边集合为 ( A \to B )权值 1( A \to C )权值 2( B \to D )权值 3( C \to D )权值 4 图是 有向图即 ( Direction  true )。 初始状态 邻接表 _tables 是一个数组初始时每个顶点的邻接表为空 
_tables: [nullptr, nullptr, nullptr, nullptr]( _tables[0] ) 表示顶点 ( A ) 的邻接表头。( _tables[1] ) 表示顶点 ( B ) 的邻接表头。( _tables[2] ) 表示顶点 ( C ) 的邻接表头。( _tables[3] ) 表示顶点 ( D ) 的邻接表头。 Step 1: 插入边 ( A \to B )权值 1 调用 AddEdge(A, B, 1)。  获取顶点索引 GetVertexIndex(A) 返回 0。GetVertexIndex(B) 返回 1。  创建新边 sd_edge sd_edge-_srcindex  0;  // A 的索引
sd_edge-_dstindex  1;  // B 的索引
sd_edge-_w  1;         // 权值 1
sd_edge-_next  _tables[0];  // 当前 A 的邻接表头nullptr
_tables[0]  sd_edge;         // 更新 A 的邻接表头为 sd_edge更新邻接表 _tables:
[sd_edge, nullptr, nullptr, nullptr]此时邻接表内容为 A: B (权值 1) - nullptr
B: nullptr
C: nullptr
D: nullptrStep 2: 插入边 ( A \to C )权值 2 调用 AddEdge(A, C, 2)。  获取顶点索引 GetVertexIndex(A) 返回 0。GetVertexIndex(C) 返回 2。  创建新边 sd_edge sd_edge-_srcindex  0;  // A 的索引
sd_edge-_dstindex  2;  // C 的索引
sd_edge-_w  2;         // 权值 2
sd_edge-_next  _tables[0];  // 当前 A 的邻接表头指向 B 的边
_tables[0]  sd_edge;         // 更新 A 的邻接表头为 sd_edge更新邻接表 _tables:
[sd_edge, nullptr, nullptr, nullptr]此时邻接表内容为 A: C (权值 2) - B (权值 1) - nullptr
B: nullptr
C: nullptr
D: nullptrStep 3: 插入边 ( B \to D )权值 3 调用 AddEdge(B, D, 3)。  获取顶点索引 GetVertexIndex(B) 返回 1。GetVertexIndex(D) 返回 3。  创建新边 sd_edge sd_edge-_srcindex  1;  // B 的索引
sd_edge-_dstindex  3;  // D 的索引
sd_edge-_w  3;         // 权值 3
sd_edge-_next  _tables[1];  // 当前 B 的邻接表头nullptr
_tables[1]  sd_edge;         // 更新 B 的邻接表头为 sd_edge更新邻接表 _tables:
[sd_edge, sd_edge, nullptr, nullptr]此时邻接表内容为 A: C (权值 2) - B (权值 1) - nullptr
B: D (权值 3) - nullptr
C: nullptr
D: nullptrStep 4: 插入边 ( C \to D )权值 4 调用 AddEdge(C, D, 4)。  获取顶点索引 GetVertexIndex(C) 返回 2。GetVertexIndex(D) 返回 3。  创建新边 sd_edge sd_edge-_srcindex  2;  // C 的索引
sd_edge-_dstindex  3;  // D 的索引
sd_edge-_w  4;         // 权值 4
sd_edge-_next  _tables[2];  // 当前 C 的邻接表头nullptr
_tables[2]  sd_edge;         // 更新 C 的邻接表头为 sd_edge更新邻接表 _tables:
[sd_edge, sd_edge, sd_edge, nullptr]此时邻接表内容为 A: C (权值 2) - B (权值 1) - nullptr
B: D (权值 3) - nullptr
C: D (权值 4) - nullptr
D: nullptr最终邻接表 
最终的邻接表结构如下 
A: C (权值 2) - B (权值 1) - nullptr
B: D (权值 3) - nullptr
C: D (权值 4) - nullptr
D: nullptr邻接表的 _tables 数据结构是 
_tables:
[sd_edge (A-C), sd_edge (B-D), sd_edge (C-D), nullptr]最后完成打印函数; 
void Print()
{for (size_t i  0; i  _vertexs.size(); i){cout  _vertexs[i]  -  i   ;}cout  endl  endl;for (int i  0; i  _tables.size(); i){cout  _vertexs[i]  [  i  ]-;Edge* cur  _tables[i];while (cur){cout  _vertexs[cur-_dstindex]  [  cur-_dstindex  ]  cur-_w  -;cur  cur-_next;}cout  nullptr  endl;}
}完整代码 
#pragma once
#includevector
#includemapusing namespace std;namespace matrix
{templateclass V, class W, W MAX_W  INT_MAX, bool Direction  falseclass Graph{public://手动添加边,方便测试Graph(const V* a, size_t n){_vertexs.reserve(n);for (size_t i  0; i  n; i){_vertexs.push_back(a[i]);_indexMap[a[i]]  i;}_matrix.resize(n);for (size_t i  0; i  _matrix.size(); i){_matrix[i].resize(n, MAX_W);}}size_t GetVertexIndex(const V v){auto it  _indexMap.find(v);if (it ! _indexMap.end()){return it-second;}else{throw invalid_argument(不存在的顶点);return -1;}}void AddEdge(const V src, const V dst, const W w){size_t srci  GetVertexIndex(src);size_t dsti  GetVertexIndex(dst);_matrix[srci][dsti]  w;if (Direction  false){_matrix[dsti][srci]  w;}}void Print(){// 打印顶点和下标映射关系for (size_t i  0; i  _vertexs.size(); i){cout  _vertexs[i]  -  i   ;}cout  endl  endl;cout    ;for (size_t i  0; i  _vertexs.size(); i){cout  i   ;}cout  endl;// 打印矩阵for (size_t i  0; i  _matrix.size(); i){cout  i   ;for (size_t j  0; j  _matrix[i].size(); j){if (_matrix[i][j] ! MAX_W)cout  _matrix[i][j]   ;elsecout  #   ;}cout  endl;}cout  endl  endl;// 打印所有的边for (size_t i  0; i  _matrix.size(); i){for (size_t j  0; j  _matrix[i].size(); j){if (i  j  _matrix[i][j] ! MAX_W){cout  _vertexs[i]  -  _vertexs[j]  : _matrix[i][j]  endl;}}}}private:vectorV _vertexs;//顶点集合;mapV, int _indexMap;//顶点映射下标;vectorvectorW _matrix;// 存储边集合的矩阵};
}
namespace LinkTable
{templateclass Wstruct LinkEdge{int _srcindex;int _dstindex;W _w;//权值LinkEdgeW* _next;LinkEdge(const W w): _srcindex(-1), _dstindex(-1), _w(w), _next(nullptr){}};templateclass V, class W,  bool Direction  falseclass Graph{typedef LinkEdgeW Edge;public:Graph(const V* a, size_t n){_vertexs.reserve(n);for (size_t i  0; i  n; i){_vertexs.push_back(a[i]);_indexMap[a[i]]  i;}_tables.resize(n,nullptr);}size_t GetVertexIndex(const V v){auto it  _indexMap.find(v);if (it ! _indexMap.end()){return it-second;}else{throw invalid_argument(不存在的顶点);return -1;}}void AddEdge(const V src, const V dst, const W w){size_t srci  GetVertexIndex(src);size_t dsti  GetVertexIndex(dst);Edge* sd_edge  new Edge(w);sd_edge-_srcindex  srci;sd_edge-_dstindex  dsti;sd_edge-_next  _tables[srci];_tables[srci]  sd_edge;if (Direction  false){Edge* ds_edge  new Edge(w);ds_edge-_srcindex  dsti;ds_edge-_dstindex  srci;ds_edge-_next  _tables[dsti];_tables[dsti]  ds_edge;}}void Print(){for (size_t i  0; i  _vertexs.size(); i){cout  _vertexs[i]  -  i   ;}cout  endl  endl;for (int i  0; i  _tables.size(); i){cout  _vertexs[i]  [  i  ]-;Edge* cur  _tables[i];while (cur){cout  _vertexs[cur-_dstindex]  [  cur-_dstindex  ]  cur-_w  -;cur  cur-_next;}cout  nullptr  endl;}}private:vectorV _vertexs;//顶点集合;mapV, int _indexMap;//顶点映射下标;vectorEdge* _tables;// 邻接表};
}
void TestGraph()
{matrix::Graphchar, int, INT_MAX, true g(0123, 4);g.AddEdge(0, 1, 1);g.AddEdge(0, 3, 4);g.AddEdge(1, 3, 2);g.AddEdge(1, 2, 9);g.AddEdge(2, 3, 8);g.AddEdge(2, 1, 5);g.AddEdge(2, 0, 3);g.AddEdge(3, 2, 6);g.Print();
}
void TestGraph2()
{string a[]  { 张三, 李四, 王五, 赵六 };LinkTable::Graphstring, int g1(a, 4);g1.AddEdge(张三, 李四, 100);g1.AddEdge(张三, 王五, 200);g1.AddEdge(王五, 赵六, 30);g1.Print();
}
 文章转载自: http://www.morning.bntfy.cn.gov.cn.bntfy.cn http://www.morning.rswtz.cn.gov.cn.rswtz.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.ktrh.cn.gov.cn.ktrh.cn http://www.morning.npxht.cn.gov.cn.npxht.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.zqkr.cn.gov.cn.zqkr.cn http://www.morning.klzt.cn.gov.cn.klzt.cn http://www.morning.nylbb.cn.gov.cn.nylbb.cn http://www.morning.rbjp.cn.gov.cn.rbjp.cn http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn http://www.morning.rfpxq.cn.gov.cn.rfpxq.cn http://www.morning.qwbtr.cn.gov.cn.qwbtr.cn http://www.morning.ztcwp.cn.gov.cn.ztcwp.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.smsjx.cn.gov.cn.smsjx.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.wyctq.cn.gov.cn.wyctq.cn http://www.morning.bgdk.cn.gov.cn.bgdk.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.lgcqj.cn.gov.cn.lgcqj.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.znrgq.cn.gov.cn.znrgq.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.zwzwn.cn.gov.cn.zwzwn.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.ptqds.cn.gov.cn.ptqds.cn http://www.morning.hgwsj.cn.gov.cn.hgwsj.cn http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn http://www.morning.gtbjf.cn.gov.cn.gtbjf.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.tgxrm.cn.gov.cn.tgxrm.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.tbknh.cn.gov.cn.tbknh.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.fnlnp.cn.gov.cn.fnlnp.cn http://www.morning.wqkfm.cn.gov.cn.wqkfm.cn http://www.morning.jkcnq.cn.gov.cn.jkcnq.cn http://www.morning.srhqm.cn.gov.cn.srhqm.cn http://www.morning.ryyjw.cn.gov.cn.ryyjw.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.wjfzp.cn.gov.cn.wjfzp.cn http://www.morning.qtkdn.cn.gov.cn.qtkdn.cn http://www.morning.sxjmz.cn.gov.cn.sxjmz.cn http://www.morning.sgqw.cn.gov.cn.sgqw.cn http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn http://www.morning.srmdr.cn.gov.cn.srmdr.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.bwxph.cn.gov.cn.bwxph.cn http://www.morning.jlschmy.com.gov.cn.jlschmy.com http://www.morning.ypcbm.cn.gov.cn.ypcbm.cn http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.sooong.com.gov.cn.sooong.com http://www.morning.qbccg.cn.gov.cn.qbccg.cn http://www.morning.hqwcd.cn.gov.cn.hqwcd.cn http://www.morning.srbfz.cn.gov.cn.srbfz.cn http://www.morning.jwfkk.cn.gov.cn.jwfkk.cn http://www.morning.mdwb.cn.gov.cn.mdwb.cn http://www.morning.rbkdg.cn.gov.cn.rbkdg.cn http://www.morning.dbjyb.cn.gov.cn.dbjyb.cn http://www.morning.syynx.cn.gov.cn.syynx.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.iuibhkd.cn.gov.cn.iuibhkd.cn http://www.morning.jfjqs.cn.gov.cn.jfjqs.cn http://www.morning.kxmyj.cn.gov.cn.kxmyj.cn http://www.morning.drhnj.cn.gov.cn.drhnj.cn http://www.morning.qtnmp.cn.gov.cn.qtnmp.cn http://www.morning.nhdw.cn.gov.cn.nhdw.cn