云大数据结构课程教学课件第7章图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A[i,j]= 0或:若(vi,vj) 或<vi,vj> 不是E(G)中的边
2020/6/30
数据结构
14
3 v1
8
1
7
v0 5
2 v3 v2
v4 邻接矩阵
带权图
2、 邻接矩阵存储结构描述:
03510 30208 A= 5 2 0 0 0 10007 08070
#define n ……. /* 图中顶点个数 */ #define e ……. /* 图中边(弧)条数 */ typedef char vextype; /* 顶点数据类型 */ typedef float adjtype;/* 权值类型 */
2020/6/30
数据结构
6
❖ 度、入度和出度的概念:
无向图中顶点v的度为关联于该顶点的边的数目,记为D(v)
有向图中把以顶点v为终点的边的数目称为v的入度,记为ID(v)
把以顶点v为始点的边的数目称为v的出度,记为OD(v)
顶点的度定义为入度与出度之和,即D(v)=ID(v)+OD(v)。
图中顶点数 n 边n数 e 和度之间的关系满足
v0为根
v1
v10
v4
v3
v2
❖无向图G中,若任意两个顶点间存在路径(即连通的),则称 G为连通图.
❖无向图G的极大连通子图称为G的连通分量.
v1
v0 v3
v2
v4 非连通图G的两个连通分量
❖有向图G中,任意两个不同的顶点 vi 和 vj ,都存在从 vi 到 vj 以及 vj 到 vi 的路径,则称G为 强连通图。
{ga[i].vertex=getchar( );ga[i].link=NULL;} for(k=0;k<e;k++)
{s{csacnanf(f"("%%dd%%dd"",&,&i,i&,&j)j;); s=s=mmalallolco(cs(isziezoefo(fe(dedgegnenodode)e));); ssaaddjvjvexex==ij;js;snnexetx=t=gag[aj[]i.]l.ilninkk;g;gaga[ja[]i[.]li.i]ln.ilnkink=k=s=;s;s;
❖若 (vi,vj) 是一条无向边,则称顶点 vi 和 vj 互为邻结点 (Adjacent),(vi,vj) 与顶点 vi 和 vj 相关联(Incident)。若 <vi,vj> 是一条有向边,则称顶点 vi 邻接到 vj,顶点 vj 邻 接于 vi, <vi,vj> 与顶点 vi 和 vj 相关联。
该算法的时间复杂度为O(n+n2+e),因为e<n2,所以为O(n2)
7.2.2 邻接表表示法
1、邻接表定义
邻接表表示法类似于树的孩子链表表示法。对于图G中的某
一个顶点vi,将邻接于它的所有顶点链成一个单链表,该单
链表称为顶点vi的邻接表。
vertex link
v1
v0
1
2
3
v4
v1
0
2
4
v0
v3
for(k=0;k<e;k++) {{{ssscccaaannnfff((("""%%%ddd%%%ddd%%",ff&"",,i&&,&ii,,j&&);jj,,&&ww));; gggaaaaaarrrcccsss[[[ii]]i][[[jjj]]]===ww11;;; ///***/有*因 有若向为 向为图是 网无**无/向/ 向图网*/*/ }}ggaaaarrccss[[jj]][[i]i]==w1; }} }
V4
V5
是个回路,但 不是简单回路
路径 V1 V2 V3 V4 V2 V5 不是简单路径
路径 V1 V2 V5
是简单路径 V1 V2 V3 V4 V2 V5 V1 而V1 V2 V5 V1 是简单回路
❖有向图的根 有向图中,若存在一个顶点v,从该顶点到图中其它各顶点 都存在路径,则称该有向图为有根图,v称为图的根。
第七章 图
v1
邻接矩阵
v0
v4
v3
v2
无向图的邻接矩阵是对称的
01110 10101 A= 1 1 0 0 0 10001 01010
v1 邻接矩阵
v10
v4
v3
v2
有向图的邻接矩阵通常是非对称的
01110 00101 A= 0 0 0 0 0 00001 00010
❖网络的邻接矩阵定义为: wij:若 (vi,vj) 或<vi,vj> 是E(G)中的边
v1
v0
v4
v3
v2
V'={v0,v1},E'={(v0,v2)}, G'=(V',E')不是图,也不可能是子图。
2020/6/30
数据结构
8
第七章 图
❖ 路径:若存在一个顶点序列vp , vi1 , vi2 , … , vin , vq: 无向图G中,使得 (vp , vi1) , (vi1 , vi2) , …… , (vin , vq) 均属于 E(G) ,则称顶点 vp到 vq 存在一条路径。 有向图G中,若 <vp , vi1> , <vi1 , vi2> , …….. , <vin , vq> 均属于E(G) , 则从顶点vp到vq存在一条路径。
e = ∑D(Vi)/2
i=1
v1
v1
v0
v4
v3
v2
D(v0)=D(v1)=3 D(v2)=D(v3)=D(v4)=2
v10
v4
v3
v2
ID(v1)=1,OD(v1)=2 D(v1)=ID(V1)+OD(V1)=3
第七章 图
❖子图的概念:设G=(V,E)是一个图,若V‘是V的子集, E’是E的子集且E‘中的边所关联的顶点均在V’中,则 G'=(V',E')也是一个图,并称其为G的子图。
next
指针域 link
vexnode ga[n];
2020/6/30
数据结构
21
第七章 图
vexnode ga1[4];
v0
vevr0tex link
v3 v1
1 0
2 2
3^ 3^
v2
0
1^
v3
40
1^
v1
v2 顶点表
边表
vexnode ga2[5];
v0
v1
v2
v4
v3
vertex livn0k v1 v2 v3 v4
❖ 路径长度:路径长度为该路径上边的数目。
v1
v10
v4
v3
v2
该有向图中顶点v1到顶点v2、 v3和v4存在路径, 到v0不存在路径
2020/6/30
数据结构
9
❖ 简单路径:除起点和终点外,其余顶点均不相同 的路径称为简单路径。起点和终点相同的简单路径称 为简单回路。
例1 从V1
V5
V3
V1
V2
顶点表
1^ 0 1 01 ^ 3^
边表
4 ^3 ^
邻
接 表
2020/6/30
数据结构
22
第七章 图
3、建立邻接表的算法描述如下: creatadjlist(ga) vexnode ga[ ]; {int i,j,k; edgenode *s; for(i=0;i<n;i++)/*读入顶点信息并初始化边表头指针*/
typedef struct { vextype vexs[n]; /* 数组vexs [ ] 用于存储顶点数据 */
adjtype arcs[n][n]; /* arcs[ ][ ]为邻接矩阵 */
} graph;
若图中顶点信息仅为编号, 则仅需存储一个邻接矩阵即可表示图。
采用邻接矩阵表示法实现图的存储,空间复杂度为O(n2)。 3、建立邻接矩阵
❖有向图G的极大强连通子图称为G的 强连通分量。
强连通图只有一个强连通分量 非强连通图有多个强连通分量
❖若将图中的每一条边赋上一个权值,则称该图为带权 图。带权图又称为网络。
3 v1
8
注意:带权图中权值的 含义视具体问题而定
v0
1
7
5
2 v3 v2
v4
带权图
7.2 图的存储
图的存储涉及到两方面:顶点内容的存储和边(逻辑关系)
邻接表
v2
v3
0 0
1 4
v2
v4
1
3
v1
v10 v3
v2
vertex link
v0
1
2
3
v4
v1
2
4
邻接表 v2 ^
v3
4
v4
3
2020/6/30
数据结构
17
7.2.2 邻接表表示法
1、邻接表定义
❖邻接表表示法类似于树的孩子链表表示法。对于图G中 的某一个顶点vi,将邻接于它的所有顶点链成一个单链 表,该单链表称为顶点vi的邻接表。
的存储。图的存储所采用的两种常用方法为:邻接矩阵
和邻接表。
7.2.1 邻接矩阵表示法
1、邻接矩阵定义
邻接矩阵指的是表示图中顶点之间相邻关系的矩阵。
❖有向图(无向图)的邻接矩阵 设G=(V,E)是具有n个顶点的图,则G的邻接矩阵为具有如下 性质的n阶方阵: 1:若 (vi,vj) 或<vi,vj> 是E(G)中的边 A[i,j]= 0:若(vi,vj) 或<vi,vj> 不是E(G)中的边
❖邻接表中结点的结构如下:
存放邻接于顶 点vi的结点的 序号j:邻接点域
adjvex next
存放指向下一个 结点的指针:链域
❖每个邻接表均有一个表头结点,该结点有两个域, 分别存放顶点vi的信息和邻接表中第一个结点的指针。
存放顶点的 信息
2020/6/30
顶点域 vertex
指针域 link
数据结构
第七章 图
图是一种复杂的非线性结构。线性结构、树形 结构中 对结点而言,存在前趋和后继的概念, 图中的结点(通常称为顶点)是否也有前趋和 后继呢?不能一概而论。
7.1 图的概念
❖ 图G由两个集合V和E组成,记为G=(V,E),其中V为顶 点的有穷非空集合,E为V中顶点偶对(即边)的集合。图 G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空 集,若E(G)为空,则图G只有顶点而没有边。
❖简单图:一条边不重复出现在图中且不存在顶点到 其自身的边。
v1
v0
v4
v3
v2
非简单图
2020/6/30
数据结构
3
❖简单图:以下我们讨论的图是满足下列两条件的简单图:
(1)不含顶点到自身的边,即若(Vi ,Vj )或〈 Vi , Vj 〉∈E(G) 则 Vi≠Vj
(2)不允许一条边在图中重复出现
2020/6/30
数据结构
2
❖无向图: 图中的每一条边都是无方向的。
v1
v0 v3
v2
一条边为两个顶点的无序对,
v4
记为(v1,v4)。一般地(vi,vj)表示 一条无向边,并且(vi,vj)和
(vj,vi)表示同一条边
V(G)={v0,v1,v2,v3,v4} E(G)={ (v0,v1),(v0,v2),(v0,v3),(v1,v2),(v1,v4),(v3,v4)}
❖ 有向图:图G中的每一条边都是有方向的。
2020/6/30
数据结构
1
v1
v0
v3
v2
一条边为两个顶点的有序对,记为
<v1,v4>。一般地<vi,vj>表示一条有 v4 向边,vi为边的起点,vj为边的终点。
有向边又称为弧,vi为弧尾,vj为弧 头
V(G)={v0,v1,v2,v3,v4} E(G)={<v0,v1>,<v0,v2>,<v0,v3>,<v1,v2>,<v1,v4>, <v3,v4>,<v4,v3>}
存放指向Vi邻接表中 第一个结点的头指针,
称为链的表头
18
第七章 图
❖我们将所有的表头结点顺序存储在一个向量中,图 就可以用这个表头向量来表示
vertex link
v1
v0
1
2
3
v4
v1
0
2
4
v0
v3
邻接表
v2
v3
0 0
1 4
v2
v4
1
3
v1
v10 v3
v2
vertex link
v0
1
2
3
v4
v1
2
4
邻接表 v2 ^v3来自4v43
2020/6/30
数据结构
19
❖将无向图的邻接表称为边表,将有向图的邻接表称为出边表 ❖有向图还有一种逆邻接表--为每个顶点vi建立一个入边表
v0
v1
v4
vertex link
v0 v1
v2 ^
v3 v4
顶点表
v3
1
0
14
1
边表
v2
3^ 2^ 2^
逆邻 接表
2、邻接表存储结构描述:
typedef struct node
adjvex
{ int adjvex;
struct node *next
} edgenode; /*边表结点结构*/
顶点域
typedef strcut {vextype vertex;
vertex
edgenode *link;
}vexnode; /*顶点表结点结构*/
具有上述要求的图,其顶点数 n 和边数 e 满足下列关系: 若G为无向图 0 ≤ e ≤ n(n-1)/2 若G为有向图 0≤ e ≤ n(n-1)
2020/6/30
数据结构
4
❖恰好有 n(n-1)/2 条边的无向图称为无向完全图; ❖恰好有 n(n-1) 边的有向图称为有向完全图。
无向完全图 有向完全图
建立一个采用邻接矩阵表示法实现存储的无向网的算法如下:
creatgraph(ga) graph ga; {int i,j,k; float w; for(i=0;i<n;i++) ga vexs[i]=getchar( ); for(i=0;i<n;i++)
for(j=0;j<n;j++) ga arcs[i][j]=0; /*初始化邻接矩阵*/
2020/6/30
数据结构
14
3 v1
8
1
7
v0 5
2 v3 v2
v4 邻接矩阵
带权图
2、 邻接矩阵存储结构描述:
03510 30208 A= 5 2 0 0 0 10007 08070
#define n ……. /* 图中顶点个数 */ #define e ……. /* 图中边(弧)条数 */ typedef char vextype; /* 顶点数据类型 */ typedef float adjtype;/* 权值类型 */
2020/6/30
数据结构
6
❖ 度、入度和出度的概念:
无向图中顶点v的度为关联于该顶点的边的数目,记为D(v)
有向图中把以顶点v为终点的边的数目称为v的入度,记为ID(v)
把以顶点v为始点的边的数目称为v的出度,记为OD(v)
顶点的度定义为入度与出度之和,即D(v)=ID(v)+OD(v)。
图中顶点数 n 边n数 e 和度之间的关系满足
v0为根
v1
v10
v4
v3
v2
❖无向图G中,若任意两个顶点间存在路径(即连通的),则称 G为连通图.
❖无向图G的极大连通子图称为G的连通分量.
v1
v0 v3
v2
v4 非连通图G的两个连通分量
❖有向图G中,任意两个不同的顶点 vi 和 vj ,都存在从 vi 到 vj 以及 vj 到 vi 的路径,则称G为 强连通图。
{ga[i].vertex=getchar( );ga[i].link=NULL;} for(k=0;k<e;k++)
{s{csacnanf(f"("%%dd%%dd"",&,&i,i&,&j)j;); s=s=mmalallolco(cs(isziezoefo(fe(dedgegnenodode)e));); ssaaddjvjvexex==ij;js;snnexetx=t=gag[aj[]i.]l.ilninkk;g;gaga[ja[]i[.]li.i]ln.ilnkink=k=s=;s;s;
❖若 (vi,vj) 是一条无向边,则称顶点 vi 和 vj 互为邻结点 (Adjacent),(vi,vj) 与顶点 vi 和 vj 相关联(Incident)。若 <vi,vj> 是一条有向边,则称顶点 vi 邻接到 vj,顶点 vj 邻 接于 vi, <vi,vj> 与顶点 vi 和 vj 相关联。
该算法的时间复杂度为O(n+n2+e),因为e<n2,所以为O(n2)
7.2.2 邻接表表示法
1、邻接表定义
邻接表表示法类似于树的孩子链表表示法。对于图G中的某
一个顶点vi,将邻接于它的所有顶点链成一个单链表,该单
链表称为顶点vi的邻接表。
vertex link
v1
v0
1
2
3
v4
v1
0
2
4
v0
v3
for(k=0;k<e;k++) {{{ssscccaaannnfff((("""%%%ddd%%%ddd%%",ff&"",,i&&,&ii,,j&&);jj,,&&ww));; gggaaaaaarrrcccsss[[[ii]]i][[[jjj]]]===ww11;;; ///***/有*因 有若向为 向为图是 网无**无/向/ 向图网*/*/ }}ggaaaarrccss[[jj]][[i]i]==w1; }} }
V4
V5
是个回路,但 不是简单回路
路径 V1 V2 V3 V4 V2 V5 不是简单路径
路径 V1 V2 V5
是简单路径 V1 V2 V3 V4 V2 V5 V1 而V1 V2 V5 V1 是简单回路
❖有向图的根 有向图中,若存在一个顶点v,从该顶点到图中其它各顶点 都存在路径,则称该有向图为有根图,v称为图的根。
第七章 图
v1
邻接矩阵
v0
v4
v3
v2
无向图的邻接矩阵是对称的
01110 10101 A= 1 1 0 0 0 10001 01010
v1 邻接矩阵
v10
v4
v3
v2
有向图的邻接矩阵通常是非对称的
01110 00101 A= 0 0 0 0 0 00001 00010
❖网络的邻接矩阵定义为: wij:若 (vi,vj) 或<vi,vj> 是E(G)中的边
v1
v0
v4
v3
v2
V'={v0,v1},E'={(v0,v2)}, G'=(V',E')不是图,也不可能是子图。
2020/6/30
数据结构
8
第七章 图
❖ 路径:若存在一个顶点序列vp , vi1 , vi2 , … , vin , vq: 无向图G中,使得 (vp , vi1) , (vi1 , vi2) , …… , (vin , vq) 均属于 E(G) ,则称顶点 vp到 vq 存在一条路径。 有向图G中,若 <vp , vi1> , <vi1 , vi2> , …….. , <vin , vq> 均属于E(G) , 则从顶点vp到vq存在一条路径。
e = ∑D(Vi)/2
i=1
v1
v1
v0
v4
v3
v2
D(v0)=D(v1)=3 D(v2)=D(v3)=D(v4)=2
v10
v4
v3
v2
ID(v1)=1,OD(v1)=2 D(v1)=ID(V1)+OD(V1)=3
第七章 图
❖子图的概念:设G=(V,E)是一个图,若V‘是V的子集, E’是E的子集且E‘中的边所关联的顶点均在V’中,则 G'=(V',E')也是一个图,并称其为G的子图。
next
指针域 link
vexnode ga[n];
2020/6/30
数据结构
21
第七章 图
vexnode ga1[4];
v0
vevr0tex link
v3 v1
1 0
2 2
3^ 3^
v2
0
1^
v3
40
1^
v1
v2 顶点表
边表
vexnode ga2[5];
v0
v1
v2
v4
v3
vertex livn0k v1 v2 v3 v4
❖ 路径长度:路径长度为该路径上边的数目。
v1
v10
v4
v3
v2
该有向图中顶点v1到顶点v2、 v3和v4存在路径, 到v0不存在路径
2020/6/30
数据结构
9
❖ 简单路径:除起点和终点外,其余顶点均不相同 的路径称为简单路径。起点和终点相同的简单路径称 为简单回路。
例1 从V1
V5
V3
V1
V2
顶点表
1^ 0 1 01 ^ 3^
边表
4 ^3 ^
邻
接 表
2020/6/30
数据结构
22
第七章 图
3、建立邻接表的算法描述如下: creatadjlist(ga) vexnode ga[ ]; {int i,j,k; edgenode *s; for(i=0;i<n;i++)/*读入顶点信息并初始化边表头指针*/
typedef struct { vextype vexs[n]; /* 数组vexs [ ] 用于存储顶点数据 */
adjtype arcs[n][n]; /* arcs[ ][ ]为邻接矩阵 */
} graph;
若图中顶点信息仅为编号, 则仅需存储一个邻接矩阵即可表示图。
采用邻接矩阵表示法实现图的存储,空间复杂度为O(n2)。 3、建立邻接矩阵
❖有向图G的极大强连通子图称为G的 强连通分量。
强连通图只有一个强连通分量 非强连通图有多个强连通分量
❖若将图中的每一条边赋上一个权值,则称该图为带权 图。带权图又称为网络。
3 v1
8
注意:带权图中权值的 含义视具体问题而定
v0
1
7
5
2 v3 v2
v4
带权图
7.2 图的存储
图的存储涉及到两方面:顶点内容的存储和边(逻辑关系)
邻接表
v2
v3
0 0
1 4
v2
v4
1
3
v1
v10 v3
v2
vertex link
v0
1
2
3
v4
v1
2
4
邻接表 v2 ^
v3
4
v4
3
2020/6/30
数据结构
17
7.2.2 邻接表表示法
1、邻接表定义
❖邻接表表示法类似于树的孩子链表表示法。对于图G中 的某一个顶点vi,将邻接于它的所有顶点链成一个单链 表,该单链表称为顶点vi的邻接表。
的存储。图的存储所采用的两种常用方法为:邻接矩阵
和邻接表。
7.2.1 邻接矩阵表示法
1、邻接矩阵定义
邻接矩阵指的是表示图中顶点之间相邻关系的矩阵。
❖有向图(无向图)的邻接矩阵 设G=(V,E)是具有n个顶点的图,则G的邻接矩阵为具有如下 性质的n阶方阵: 1:若 (vi,vj) 或<vi,vj> 是E(G)中的边 A[i,j]= 0:若(vi,vj) 或<vi,vj> 不是E(G)中的边
❖邻接表中结点的结构如下:
存放邻接于顶 点vi的结点的 序号j:邻接点域
adjvex next
存放指向下一个 结点的指针:链域
❖每个邻接表均有一个表头结点,该结点有两个域, 分别存放顶点vi的信息和邻接表中第一个结点的指针。
存放顶点的 信息
2020/6/30
顶点域 vertex
指针域 link
数据结构
第七章 图
图是一种复杂的非线性结构。线性结构、树形 结构中 对结点而言,存在前趋和后继的概念, 图中的结点(通常称为顶点)是否也有前趋和 后继呢?不能一概而论。
7.1 图的概念
❖ 图G由两个集合V和E组成,记为G=(V,E),其中V为顶 点的有穷非空集合,E为V中顶点偶对(即边)的集合。图 G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空 集,若E(G)为空,则图G只有顶点而没有边。
❖简单图:一条边不重复出现在图中且不存在顶点到 其自身的边。
v1
v0
v4
v3
v2
非简单图
2020/6/30
数据结构
3
❖简单图:以下我们讨论的图是满足下列两条件的简单图:
(1)不含顶点到自身的边,即若(Vi ,Vj )或〈 Vi , Vj 〉∈E(G) 则 Vi≠Vj
(2)不允许一条边在图中重复出现
2020/6/30
数据结构
2
❖无向图: 图中的每一条边都是无方向的。
v1
v0 v3
v2
一条边为两个顶点的无序对,
v4
记为(v1,v4)。一般地(vi,vj)表示 一条无向边,并且(vi,vj)和
(vj,vi)表示同一条边
V(G)={v0,v1,v2,v3,v4} E(G)={ (v0,v1),(v0,v2),(v0,v3),(v1,v2),(v1,v4),(v3,v4)}
❖ 有向图:图G中的每一条边都是有方向的。
2020/6/30
数据结构
1
v1
v0
v3
v2
一条边为两个顶点的有序对,记为
<v1,v4>。一般地<vi,vj>表示一条有 v4 向边,vi为边的起点,vj为边的终点。
有向边又称为弧,vi为弧尾,vj为弧 头
V(G)={v0,v1,v2,v3,v4} E(G)={<v0,v1>,<v0,v2>,<v0,v3>,<v1,v2>,<v1,v4>, <v3,v4>,<v4,v3>}
存放指向Vi邻接表中 第一个结点的头指针,
称为链的表头
18
第七章 图
❖我们将所有的表头结点顺序存储在一个向量中,图 就可以用这个表头向量来表示
vertex link
v1
v0
1
2
3
v4
v1
0
2
4
v0
v3
邻接表
v2
v3
0 0
1 4
v2
v4
1
3
v1
v10 v3
v2
vertex link
v0
1
2
3
v4
v1
2
4
邻接表 v2 ^v3来自4v43
2020/6/30
数据结构
19
❖将无向图的邻接表称为边表,将有向图的邻接表称为出边表 ❖有向图还有一种逆邻接表--为每个顶点vi建立一个入边表
v0
v1
v4
vertex link
v0 v1
v2 ^
v3 v4
顶点表
v3
1
0
14
1
边表
v2
3^ 2^ 2^
逆邻 接表
2、邻接表存储结构描述:
typedef struct node
adjvex
{ int adjvex;
struct node *next
} edgenode; /*边表结点结构*/
顶点域
typedef strcut {vextype vertex;
vertex
edgenode *link;
}vexnode; /*顶点表结点结构*/
具有上述要求的图,其顶点数 n 和边数 e 满足下列关系: 若G为无向图 0 ≤ e ≤ n(n-1)/2 若G为有向图 0≤ e ≤ n(n-1)
2020/6/30
数据结构
4
❖恰好有 n(n-1)/2 条边的无向图称为无向完全图; ❖恰好有 n(n-1) 边的有向图称为有向完全图。
无向完全图 有向完全图
建立一个采用邻接矩阵表示法实现存储的无向网的算法如下:
creatgraph(ga) graph ga; {int i,j,k; float w; for(i=0;i<n;i++) ga vexs[i]=getchar( ); for(i=0;i<n;i++)
for(j=0;j<n;j++) ga arcs[i][j]=0; /*初始化邻接矩阵*/