数据结构《第七章、图》ppt课件_第1页
数据结构《第七章、图》ppt课件_第2页
数据结构《第七章、图》ppt课件_第3页
数据结构《第七章、图》ppt课件_第4页
数据结构《第七章、图》ppt课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、7.1 笼统数据类型图的定义笼统数据类型图的定义7.2 图的存储表示图的存储表示7.3 图的遍历图的遍历7.4 最小生成树最小生成树7.5 重双连通图和关节点重双连通图和关节点7.6 两点之间的最短途径问题两点之间的最短途径问题7.7 拓扑排序拓扑排序7.8 关键途径关键途径 图是由一个顶点集图是由一个顶点集 V 和一个弧集和一个弧集 R构成的数据构造。构成的数据构造。 Graph = (V, R )其中,其中,VR| v,wV 且且 P(v,w) 表示从表示从 v 到到 w 的一条弧,并称的一条弧,并称 v 为弧头,为弧头,w 为弧尾。为弧尾。 谓词谓词 P(v,w) 定义了弧定义了弧 的意

2、义或的意义或信息。信息。图的构造定义图的构造定义: 由于“弧是有方向的,因此称由顶点集和弧集构成的图为有向图。EACBD例如例如: :G1 = (V1, VR1)其中V1=A, B, C, D, EVR1=, , , , , , 假设VR 必有VR, 那么称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。BCAFED由顶点集和边集构成的图称作无向图。例如: G2=(V2,VR2)V2=A, B, C, D, E, FVR2=(A, B), (A, E), (B, E), (C, D), (D, F), (B, F), (C, F) 名词和术语名词和术语网、子图 完全图、稀疏图、稠密图邻接

3、点、度、入度、出度途径、途径长度、简单途径、简单回路连通图、连通分量、强连通图、强连通分量生成树、生成森林ABECFAEABBC设图G=(V,VR) 和图 G=(V,VR),且 VV, VRVR,那么称 G 为 G 的子图。1597211132 弧或边带权的图分别称作有向网或无向网。假设图中有 n 个顶点,e 条边,那么 含有 e=n(n-1)/2 条边的无向图称作完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 假设边或弧的个数 enlogn,那么称作稀疏图,否那么称作稠密图。 假假设顶点v 和顶点w 之间存在一条边,那么称顶点v 和w 互为邻接点,例如例如: :ID(B)

4、= 3ID(A) = 2 边(v,w) 和顶点v 和w 相关联。 和顶点v 关联的边的数目定义为边的度。ACDFEB右侧图中顶点的出度: 以顶点v 为弧尾的弧的数目;ABECF对有向图来说,对有向图来说,顶点的入度: 以顶点v为弧头的弧的数目。顶点的度(TD)=出度(OD)+入度(ID)例如例如: :ID(B) = 2OD(B) = 1TD(B) = 3由于弧有方向性,那么有入度和出度之分设图G=(V,VR)中的一个顶点序列 u=vi,0,vi,1, , vi,m=w中,(vi,j-1,vi,j)VR 1jm,那么称从顶点u 到顶点w 之间存在一条途径。途径上边的数目称作途径长度。ABECF如

5、如: :从从A A到到F F长度为长度为 3 3 的途径的途径A,B,C,FA,B,C,F简单途径简单途径: :指序列中顶指序列中顶点不反复出现的途径。点不反复出现的途径。简单回路简单回路: :指序列中指序列中第一个顶点和最后第一个顶点和最后一个顶点一样的途一个顶点一样的途径。径。假设图G中恣意两个顶点之间都有途径相通,那么称此图为连通图;假设无向图为非连通图,那么图中各个极大连通子图称作此图的连通分量。BACDFEBACDFE 假设恣意两个顶点之间都存在一条有向途径,那么称此有向图为强连通图。ABECFABECF对有向图,对有向图,否那么,其各个强连通子图称作它的强连通分量。 假设一个连通图

6、有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。对非连通图,那么称由各个连通分量的生成树的集合为此非连通图的生成森林。BACDFE构造的建立和销毁构造的建立和销毁插入或删除顶点插入或删除顶点对邻接点的操作对邻接点的操作对顶点的访问操作对顶点的访问操作遍历遍历插入和删除弧插入和删除弧根本操作根本操作CreatGraph(&G, V, VR): / 按定义按定义(V, VR) 构造图构造图DestroyGraph(&G): / 销毁图销毁图构造的建立和销毁构造的建立和销毁对顶点的访问操作对顶点的访问操作Locat

7、eVex(G, u); / 假设假设G中存在顶点中存在顶点u,那么前往该,那么前往该顶点在顶点在 / 图中图中“位置位置 ;否那么前往其它信;否那么前往其它信息。息。GetVex(G, v); / 前往前往 v 的值。的值。PutVex(&G, v, value); / 对对 v 赋值赋值value。对邻接点的操作对邻接点的操作FirstAdjVex(G, v); / 前往前往 v 的的“第一个邻接点第一个邻接点 。假设该。假设该顶点顶点/在在 G 中没有邻接点,那么前往中没有邻接点,那么前往“空。空。NextAdjVex(G, v, w); / 前往前往 v 的相对于的相对于 w 的

8、的 “下一个邻下一个邻接接/ 点。假设点。假设 w 是是 v 的最后一个邻接的最后一个邻接点,那么点,那么/ 前往前往“空。空。插入或删除顶点插入或删除顶点InsertVex(&G, v); /在图在图G中增添新顶点中增添新顶点v。DeleteVex(&G, v); / 删除删除G中顶点中顶点v及其相关的弧。及其相关的弧。插入和删除弧插入和删除弧InsertArc(&G, v, w); / 在在G中增添弧中增添弧,假设,假设G是无向的,是无向的, /那么还增添对称弧那么还增添对称弧。DeleteArc(&G, v, w); /在在G中删除弧中删除弧,假设,假设G

9、是无向的,是无向的, /那么还删除对称弧那么还删除对称弧。遍遍 历历DFSTraverse(G, v, Visit(); /从顶点从顶点v起深度优先遍历图起深度优先遍历图G,并对每,并对每/个顶点调用函数个顶点调用函数Visit一次且仅一次。一次且仅一次。BFSTraverse(G, v, Visit(); /从顶点从顶点v起广度优先遍历图起广度优先遍历图G,并对每,并对每/个顶点调用函数个顶点调用函数Visit一次且仅一次。一次且仅一次。7.2 图的存储表示图的存储表示一、图的数组一、图的数组(邻接矩阵邻接矩阵)存储表示存储表示二、图的邻接表存储表示三、有向图的十字链表存储表示 四、无向图的

10、邻接多重表存储表示Aij=0 (i,j)VR1 (i,j)VR一、图的数组一、图的数组( (邻接矩阵邻接矩阵) )存储表示存储表示BACDFE定义定义:矩阵的元素为矩阵的元素为010010100010000101001001110000011100有向图的邻接矩阵有向图的邻接矩阵为非对称矩阵为非对称矩阵ABECF0 1 0 0 10 0 1 0 00 0 0 1 01 1 0 0 00 0 1 0 0typedef struct ArcCell / 弧的定义弧的定义 VRType adj; / VRType是顶点关系类是顶点关系类型。型。 / 对无权图,用对无权图,用1或或0表示相邻否;表示相

11、邻否; / 对带权图,那么为权值类型。对带权图,那么为权值类型。 InfoType *info; / 该弧相关信息的指针该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUM MAX_VERTEX_NUM;typedef struct / 图的定义图的定义 VertexType / 顶点信息顶点信息 vexsMAX_VERTEX_NUM; AdjMatrix arcs; / 弧的信息弧的信息 int vexnum, arcnum; / 顶点数,弧顶点数,弧数数 GraphKind kind; / 图的种类标志图的种类标志 MGraph;DBACFE二、图的邻接表二

12、、图的邻接表 存储表示存储表示 A 1 4 B 0 4 5 C 3 5 D 2 5 E 0 1 F 1 2 30 1 2 3 4 5有向图的邻接表有向图的邻接表1 4230 120 1 2 3 4 A B C D EABECF可见,在有向图的邻接表中不易找到指向该顶点的弧ABECD有向图的逆邻接表有向图的逆邻接表A B C D E 303420 01234在有向图的邻接表中,对每个顶点,链接的是指向该顶点的弧typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位该弧所指向的顶点的位置置 struct ArcNode *nextarc; / 指向下一条弧的

13、指针指向下一条弧的指针 InfoType *info; / 该弧相关信息的指针该弧相关信息的指针 ArcNode;adjvex nextarc info弧的结点构造弧的结点构造typedef struct VNode VertexType data; / 顶点信息顶点信息 ArcNode *firstarc; / 指向第一条依靠该顶点的弧指向第一条依靠该顶点的弧 VNode, AdjListMAX_VERTEX_NUM; data firstarc顶点的结点构造顶点的结点构造typedef struct AdjList vertices; int vexnum, arcnum; int kin

14、d; / 图的种类标志图的种类标志 ALGraph;图的构造定义图的构造定义(邻接表邻接表)三、有向图的十字链表存储表示三、有向图的十字链表存储表示 ABCABC0 1 20 2 0 12 1 2 0 弧的结点构造弧的结点构造弧尾顶点位置 弧头顶点位置 弧的相关信息指向下一个有一样弧尾的结点指向下一个有一样弧头的结点typedef struct ArcBox / 弧的构造表示弧的构造表示 int tailvex, headvex; InfoType *info; struct ArcBox *hlink, *tlink; VexNode;tailvexheadvexhlink tlinkinf

15、o顶点的结点构造顶点的结点构造顶点信息数据 指向该顶点的第一条入弧指向该顶点的第一条出弧typedef struct VexNode / 顶点的构造表示顶点的构造表示 VertexType data; ArcBox *firstin, *firstout; VexNode;datafirstinfirstouttypedef struct VexNode xlistMAX_VERTEX_NUM; / 顶点结点顶点结点(表头向量表头向量) int vexnum, arcnum; /有向图的当前顶点数和弧数有向图的当前顶点数和弧数 OLGraph;有向图的构造表示有向图的构造表示(十字链表十字链表

16、)四、无向图的邻接多重表存储表示typedef struct Ebox VisitIf mark; / 访问标志访问标志 int ivex, jvex; /该边依靠的两个顶点的位置该边依靠的两个顶点的位置 struct EBox *ilink, *jlink; InfoType *info; / 该边信息指针该边信息指针 EBox;边的构造表示边的构造表示typedef struct / 邻接多重表邻接多重表 VexBox adjmulistMAX_VERTEX_NUM; int vexnum, edgenum; AMLGraph;顶点的构造表示顶点的构造表示typedef struct Ve

17、xBox VertexType data; EBox *firstedge; / 指向第一条依靠该顶点的边指向第一条依靠该顶点的边 VexBox;无向图的构造表示无向图的构造表示7.3 图的遍历图的遍历 从图中某个顶点出发游历图,访遍图中其他顶点,并且使图中的每个顶点仅被访问一次的过程。深度优先搜索深度优先搜索广度优先搜索广度优先搜索遍历运用举例遍历运用举例 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中一切和V0有途径相通的顶点都被访问到。一、深度优先搜索遍历图一、深度优先搜索遍历图连通图的深度优先搜索遍历连通图的深度优先搜索遍历S

18、G1SG2SG3W1、W2和W3 均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3 的子图。访问顶点 V ;for (W1、W2、W3 ) 假设该邻接点W未被访问, 那么从它出发进展深度优先搜索遍历。Vw1w3w2从上页的图解可见从上页的图解可见:1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;处理的方法是:为每个顶点设立一个 “访问标志 visitedw;2. 如何判别V的邻接点能否被访问?void DFS(Graph G, int v) / 从顶点从顶点v出发,深度优先搜索遍历连通出发,深度优先搜索遍历连通图图 G visitedv = TRUE; Vi

19、sitFunc(v); for(w=FirstAdjVex(G, v); w!=0; w=NextAdjVex(G,v,w) if (!visitedw) DFS(G, w); / 对对v的尚未访问的邻接顶点的尚未访问的邻接顶点w / 递归调用递归调用DFS / DFS 首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,假设未被访问,那么以该顶点为起始点,进展深度优先搜索遍历,否那么继续检查下一顶点。非连通图的深度优先搜索遍历非连通图的深度优先搜索遍历void DFSTraverse(Graph G, Status (*Visit)(int v) / 对图对图 G 作深度优

20、先遍历。作深度优先遍历。 VisitFunc = Visit; for (v=0; vG.vexnum; +v) visitedv = FALSE; / 访问标志数组初始访问标志数组初始化化 for (v=0; vw1, V-w2, V-w8 的途径长度为1;V-w7, V-w3, V-w5 的途径长度为2;V-w6, V-w4 的途径长度为3。w1Vw2w7w6w3w8w5w4 从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的一切未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中一切和V0有途径相通的顶点都被访问到。 假设此时图中尚有顶点未被访问,那么

21、另选图中一个未曾被访问的顶点作起始点,反复上述过程,直至图中一切顶点都被访问到为止。 void BFSTraverse(Graph G, Status (*Visit)(int v) for (v=0; vG.vexnum; +v) visitedv = FALSE; /初始化访问标志初始化访问标志 InitQueue(Q); / 置空的辅助队列置空的辅助队列Q for ( v=0; vnext = Q.rear-next = NULL;void EnQueue( LinkQueue& Q, QelemType e ) p = new QNode; p-data = e; p-next

22、 = NULL; p-priou = Q.front; Q.rear-next = p; Q.rear = p;void DeQueue( LinkQueue& Q, QelemType& e ) Q.front = Q.front-next; e = Q.front-data7.4 (连通网的连通网的)最小生成树最小生成树 假设要在 n 个城市之间建立通讯联络网,那么连通 n 个城市只需求建筑 n-1条线路,如何在最节省经费的前提下建立这个通讯网?问题:问题: 构造网的一棵最小生成树,即: 在 e 条带权的边中选取 n-1 条边不构成回路,使“权值之和为最小。算法二:克鲁斯卡

23、尔算法算法二:克鲁斯卡尔算法该问题等价于:该问题等价于:算法一:普里姆算法算法一:普里姆算法 取图中恣意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和曾经在生成树上的顶点v 之间必定存在一条边,并且该边的权值在一切连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n-1 个顶点为止。普里姆算法的根本思想普里姆算法的根本思想:abcdegf195141827168213127例如例如: :aedcbgf148531621所得生成树权值和 = 14+8+3+5+16+21 = 67 在生成树的构造过程中,图中 n 个顶点分属

24、两个集合:已落在生成树上的顶点集 U 和尚未落在生成树上的顶点集V-U ,那么应在一切连通U中顶点和V-U中顶点的边中选取权值最小的边。 普通情况下所添加的顶点应满足以下条件:UV-U 设置一个辅助数组,对当前设置一个辅助数组,对当前VU集集中的每个顶点,记录和顶点集中的每个顶点,记录和顶点集U中顶点中顶点相衔接的代价最小的边:相衔接的代价最小的边:struct VertexType adjvex; / U集中的顶点序号集中的顶点序号 VRType lowcost; / 边的权值边的权值 closedgeMAX_VERTEX_NUM;abcdegf195141827168213127close

25、dge0123456AdjvexLowcostaedcbaaa19141814例如例如:e12ee8168d3dd7213c5 5 19 m m 14 m 1819 5 7 12 m m m 5 3 m m m m 7 3 8 21 m14 12 m 8 m 16 m m m 21 m 2718 m m m 16 27void MiniSpanTree_P(MGraph G, VertexType u) /用普里姆算法从顶点u出发构造网G的最小生成树 k = LocateVex ( G, u ); for ( j=0; jG.vexnum; +j ) / 辅助数组初始化 if (j!=k) c

26、losedgej = u, G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uu for (i=0; iG.vexnum; +i) 继续向生成树上添加顶点继续向生成树上添加顶点; k = minimum(closedge); / 求出参与生成树的下一个顶点(k) printf(closedgek.adjvex, G.vexsk); / 输出生成树上一条边 closedgek.lowcost = 0; / 第k顶点并入U集 for (j=0; jG.vexnum; +j) /修正其它顶点的最小边 if (G.arcskj.adj closedgej.lowc

27、ost) closedgej = G.vexsk, G.arcskj.adj ; 详细做法详细做法: 先构造一个只含先构造一个只含 n 个顶点的子图个顶点的子图 SG,然后从权值最小的边开场,假设它的,然后从权值最小的边开场,假设它的添加不使添加不使SG 中产生回路,那么在中产生回路,那么在 SG 上加上加上这条边,如此反复,直至加上上这条边,如此反复,直至加上 n-1 条边条边为止。为止。思索问题的出发点思索问题的出发点: 为使生成树上边的权为使生成树上边的权值之和到达最小,那么应使生成树中每一值之和到达最小,那么应使生成树中每一条边的权值尽能够地小。条边的权值尽能够地小。克鲁斯卡尔算法的根

28、本思想:克鲁斯卡尔算法的根本思想:abcdegf195141827168213127aedcbgf148531621例如例如: :7121819算法描画算法描画:构造非连通图 ST=( V, ); k = i = 0; / k 计选中的边数 while (kadjvex; DFSArticul(G, v); / 从第v顶点出发深度优先搜索 if (count nextarc) void DFSArticul(ALGraph G, int v0) / 从第v0个顶点出发深度优先遍历图 G, / 查找并输出关节点 / DFSArticulmin =visitedv0 = +count; / v0是

29、第count个访问的顶点, 并设lowv0的初值为min / 检查v0的每个邻接点lowv0 = min; w = p-adjvex; / w为v0的邻接顶点 if (visitedw = 0) / w未曾被访问 DFSArticul(G, w); / 前往前求得loww else / w是回边上的顶点if (loww =visitedv0) printf(v0, G.verticesv0.data); /输出关节点输出关节点if (visitedw min) min = visitedw;7.6 两点之间的两点之间的 最短途径问题最短途径问题 求从某个源点到其他各点的求从某个源点到其他各点的

30、最短途径最短途径 每一对顶点之间的最短途径每一对顶点之间的最短途径 求从源点到其他各点的最短途径求从源点到其他各点的最短途径的算法的根本思想的算法的根本思想: 依最短途径的长度递增的次序求得依最短途径的长度递增的次序求得各条途径各条途径源点源点v1其中,从源点到顶点v的最短途径是一切最短途径中长度最短者。v2 在这条途径上,必定只含一条弧,并且这条弧的权值最小。 下一条途径长度次短的最短途径的特点:途径长度最短的最短途径的特点: 它只能够有两种情况:或者是直接从源点到该点(只含一条弧); 或者是,从源点经过顶点v1,再到达该顶点(由两条弧组成)。其他最短途径的特点:再下一条途径长度次短的最短途

31、径的特点: 它能够有三种情况:或者是,直接从源点到该点(只含一条弧); 或者是,从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是,从源点经过顶点v2,再到达该顶点。 它或者是直接从源点到该点(只含一条弧); 或者是,从源点经过已求得最短途径的顶点,再到达该顶点。求最短途径的迪杰斯特拉算法:普通情况下,Distk = 或者 = + 设置辅助数组Dist,其中每个分量Distk 表示 当前所求得的从源点到其他各顶点 k 的最短途径。1在一切从源点出发的弧中选取一条权值最小的弧,即为第一条最短途径。2修正其它各顶点的Distk值。假设求得最短途径的顶点为u,假设 Distu+G.arcsuk

32、Distk那么将 Distk 改为 Distu+G.arcsukINFINITYkvarcsGkDist0.V0和k之间存在弧V0和k之间不存在弧其中的最小值即为最短途径的长度。其中的最小值即为最短途径的长度。求每一对顶点之间的最短途径弗洛伊德算法的根本思想是: 从 vi 到 vj 的一切能够存在的途径中,选出一条长度最短的途径假设存在,那么存在途径vi,vj / 途径中不含其它顶点假设,存在,那么存在途径vi,v1,vj / 途径中所含顶点序号不大于1假设vi,v2, v2,vj存在, 那么存在一条途径vi, , v2, vj / 途径中所含顶点序号不大于2 依次类推,那么 vi 至 vj

33、的最短途径应是上述这些途径中,途径长度最小者。7.7 拓扑排序拓扑排序 问题问题: 假设以有向图表示一个工程的施工图或程序的数据流图,那么图中不允许出现回路。 检查有向图中能否存在回路的方法之一,是对有向图进展拓扑排序。何谓何谓“拓扑排序?拓扑排序?对有向图进展如下操作: 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,那么可以人为加上恣意的次序关系。例如:对于以下有向图BDAC可求得拓扑有序序列: A B C D 或 A C B D由此所得顶点的线性序列称之为拓扑有序序列BDAC反之,对于以下有向图不能求得它的拓扑有序序列。由于图中存在一个回路 B,

34、 C, D如何进展拓扑排序?如何进展拓扑排序?一、从有向图中选取一个没有前驱 的顶点,并输出之; 反复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。二、从有向图中删去此顶点以及所 有以它为尾的弧;abcghdfeabhcdgfe在算法中需求用定量的描画替代定性的概念在算法中需求用定量的描画替代定性的概念 没有前驱的顶点没有前驱的顶点 入度为零的顶点入度为零的顶点删除顶点及以它为尾的弧删除顶点及以它为尾的弧 弧头顶点的入度减弧头顶点的入度减1取入度为零的顶点v;while (v0) printf(v); +m; w:=FirstAdj(v); while (w0) inDegreew-

35、; w:=nextAdj(v,w); 取下一个入度为零的顶点v;if mn printf(“图中有回路);算法描画算法描画 为防止每次都要搜索入度为零的顶点,在算法中设置一个“栈,以保管“入度为零的顶点。CountInDegree(G,indegree); /对各顶点求入度InitStack(S);for ( i=0; iG.vexnum; +i) if (!indegreei) Push(S, i); /入度为零的顶点入栈count=0; /对输出顶点计数while (!EmptyStack(S) Pop(S, v); +count; printf(v); for (w=FirstAdj(v); w; w=NextAdj(G,v,w) -indegree(w); / 弧头顶点的入度减一 if (!indegreew) Push(S, w); /新产生的入度为零的顶点入栈 if (countG.vexnum) printf(“图中有回路)7.8 关键途径关键途径问题问题: 假设以有向网表示一个施工流图,弧上的权值表示完成该项子工程所需时间。问:哪些子工

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论