7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 ...

Download 7.1  图的定义和术语 7.2  图的存储结构 7.3  图的遍历 7.4  图的连通性问题 7.5  有向无环图的应用 7.6  最短路径

If you can't read please download the document

Upload: elisa

Post on 20-Mar-2016

136 views

Category:

Documents


9 download

DESCRIPTION

第 7 章 图. 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图的应用 7.6 最短路径. 本章重点难点. 重点 : (1) 图的定义、术语和性质; (2)ADT 图的设计和实现; (3) 图的邻接矩阵、邻接表的存储结构及其构造方法; (4) 图的两种遍历方法:深度优先遍历和广度优先遍历; (5) 最小生成树的算法、拓扑排序的算法; (6) 理解关键路径的算法,构造最短路径的 Dijkstra 算法和 Floyed 算法。. - PowerPoint PPT Presentation

TRANSCRIPT

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    (1)(2)ADT(3)(4)(5)(6)DijkstraFloyedDijkstraFloyed

    1

    7 *

    7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    7.1 GG= VE G1=V1={v0 ,v1,v2,v3,v4 }E1={ (v0,v1),(v0,v3),(v1,v2), (v1,v4),(v2,v3)(v2,v4) }

    1

    7 *

    (Undigraph) GG(Digraph) GG(Arc) 7.1 G1 V0 V4 V3 V1 V2V0 V1 V2 V3G2

    1

    7 *

    (Undirected Complete Graph)n(n-1)/2(Directed Complete Graph)n(n-1) 7.1 e= (v, u), vu e

    1

    7 *

    vD(v)vv, ID(v); vv, OD(v) 7.1 eDv

    1

    7 *

    7.1 : D=VEv1,v2, ,vk, E (i=1,2,k-1), v =v1, u =vk, vuv=u:G=VEv1,v2, ,vk,(vi,vi+1)E( i=1,2,k-1), v =v1, u =vk, vuv=u

    1

    7 *

    1V0,V1,V2,V3 V0V3V0,V1,V2,V3,V02V0,V2,V3 V0V3 V0,V2,V3,V0G1G2 V0 V4 V3 V1 V2V0 V1 V2 V37.1

    1

    7 *

    7.1 : ,,,

    1

    7 *

    1V0,V1,V2,V3 V0,V1,V2,V4,V12 V0,V2,V3,V0G1G2 V0 V4 V3 V1 V2V0 V1 V2 V37.1

    1

    7 *

    7.1 : ()G=< V, E > vu v u G

    1

    7 *

    7.1 : G=VEG1=V1E1V1 VE1 EE1V1 G1G: ,

    1

    7 *

    7.1 :GG TG T TG TG T

    1

    7 *

    ADT Graph { V

    R

    } ADT Graph 7.1 V , R={VR}VR={v,wVP(v,w)

    1

    7 *

    CreatGraph(&G) //DestroyGraph(&G) // 7.1 InsertVEx(&G, v) //DeleteVEx(&G, v) //InsertArc(&G, v, w) //DeleteArc(&G, v, w) //DFSTraVErse(G, v, Visit()) //BFSTraVErse(G, v, Visit()) //

    1

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    7.2.17.2.27.2

    1

    7 *

    (1)(2): G=, V={v0,v1,v2, vn-1 },

    7.2

    1

    7 *

    (Adjacency Matrix)7.2.1 Gn A[i][j]=1 (vi,vi+1)E E0

    1

    7 *

    0 1 2 30 0 1 1 11 1 0 0 12 1 0 0 13 1 1 1 0(1)i(2),(3)?7.2.1 V0 V2 V1 V3

    1

    7 *

    0 1 2 30 0 1 1 11 1 0 0 12 1 0 0 13 1 1 1 0(1)i(i)(2)(3)7.2.1 V0 V2 V1 V3

    1

    7 *

    0 1 2 3 401234 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0v0v4v2v1v3i7.2.1

    1

    7 *

    0 1 2 3 401234 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0v0v4v2v1v3ii7.2.1

    1

    7 *

    7.2.1 n A[i][j]=Wij (vi,vi+1)E E0

    1

    7 *

    () 0 1 2 3 401234 2 4 2 2 2 v0v4v2v1v3224227.2.1

    1

    7 *

    #define INFINITY INT_MAX //#define MAX_VERTEX_NUM //Typedef enum {DG,DN,UDG,UDN} GraphKind;typedef struct ArcCell { // VRType adj; // VRType InfoType *info; // } ArcCell, AdjMatrix[MAX_VERTEX_NUM] [MAX_VERTEX_NUM];7.2.1

    1

    7 *

    7.2.1 typedef struct { // VErtexType // vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; // int vexnum, arcnum; // GraphKind kind; // } MGraph;

    MGraph G;

    1

    7 *

    2153462030504070807.2.1

    1

    7 *

    ()G7.2.1 G.VExnumG.arcnumG.kind1G.vexs[i];2 G.arcs[i][j].adj=INFINITY; i,j,w,G.arcs[i][j].adj=W; G.arcs[j][i].adj=W

    1

    7 *

    void Creatgraph(MGraph &G){int i,j,k;float w; scanf(%d,%d,%d,G.VExnum,G.arcnum,G.kind);for(i=1;i

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    7.3.17.3.2 7.3

    1

    7 *

    v1v6v3v2v4v5v7v8v9v1v6v3v2v4v5v7v8v9Visited[9]1111111117.3.1

    000000000

    123456789

    1

    7 *

    7.3.1 (1)Vi(2)ViVjVj;(3)VjVi

    1

    7 *

    :1v;23vwwv(v)7.3.1

    1

    7 *

    void DFS(Graph G, int v) { // v G visited[v] = TRUE; VisitFunc(v); for(w=FirstAdjVEx(G, v);w!=0; w=NextAdjVEx(G,v,w)) if (!visited[w]) DFS(G, w); // vw // DFS} // DFS7.3.1

    1

    7 *

    FALSE, 7.3.1

    1

    7 *

    void DFSTraVErse(Graph G, Status (*Visit)(int v)) { // G VisitFunc = Visit; for (v=0; v

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    7.4.1 **7.4.2 7.4.3 **7.4.4 7.4

    1

    7 *

    7.4.1

    1

    7 *

    7.4.1 ()()

    1

    7 *

    MSTabcdefg18181915208209315167.4.1 G=(V,E)UV(u,v)(),uUvV-U(u,v) (f,e), (f,d),(g,d),(c,d)(f,e),

    1

    7 *

    7.4.1 G=(V,E)TG (1)U={1|1V}()T={ } (2)min{weight(u,v)|uUvV-U}(ui,vi)TviU (3)bU=V --(Prim)

    1

    7 *

    v2v5v6v4v1v36515536642v2v5v6v4v1v3651100100lowcost0 1 2 3 4 5adjVExclosedge[n]7.4.1 (Prim)

    0615100100

    v1v1v1v1v1

    1

    7 *

    v1-v3:lowcostclosedge[n]0 1 2 3 4 55v306 v3v34 adjVEx7.4.1 (Prim)v2v5v6v4v1v36515536642v2v5v6v4v1v3651100100

    0615100100

    v1v1v1v1v1

    1

    7 *

    v1-v3v3-v6v2v5v6v4v1v351465lowcostclosedge[n]0 1 2 3 4 520v6adjVEx7.4.1 (Prim)v2v5v6v4v1v36515536642

    050564

    v3v1v1v3v3

    1

    7 *

    v1-v3v3-v6v6-v4v2v5v6v4v1v321465v3-v2v2-v5lowcostclosedge[n]0 1 2 3 4 500v23adjVEx7.4.1 (Prim)v2v5v6v4v1v36515536642

    050260

    v3v1v6v3v3

    1

    7 *

    void MiniSpanTree_P(MGraph G, VErtexType u) { k = LocateVEx (G, u ); for ( j=0; j

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

    7 *

    7.5 7.5.1 7.5.2

    1

    7 *

    DAG DAG(project) 7.5

    1

    7 *

    1

    2

    7.5

    1

    7 *

    7.5.1

    1

    7 *

    1 8 2 4,5 3 4,5 4 5 4,6 6 9 7 6 8 9 9 10 17.5.1

    1

    7 *

    94652381710 1 82 4,53 4,54 5 4,66 97 68 99 10 17.5.1 DAG

    1

    7 *

    (AOV) AOVAOVvivjvivj 7.5.1 AOV

    1

    7 *

    (1);(2);(3);(4)AOV 7.5.1

    1

    7 *

    7.5.1 (1)0(2)(3)ab0()

    1

    7 *

    123897564123897564 7.5.1

    1

    7 *

    indegree[]v1v6v4v32 1 1 0 0 7.5.1

    4

    5

    2^

    5

    5^

    v1v2^V3V4V5^V6

    3

    4^

    2^

    021230

    1

    7 *

    indegree[](1)indegree[],;(2)while() { vi; vi,vj1, vj0,vj; }(3)n,7.5.1

    1

    7 *

    void FindInDegree(ALGraph G, int indegree[]){int i; ArcNode *p; for (i=0;iadjvex]++; p=p->next; } }}7.5.1

    1

    7 *

    Status TopologicalSort(ALGraph G) { SqStack S; int count,k,i; ArcNode *p; int indegree[MAX_VERTEX_NUM]; FindInDegree(G, indegree); // InitStack(S); for (i=0; inextarc) { k = p->adjVEx; if (!(--indegree[k])) Push(S, k); } } if (countinfo > ve[k]) ve[k] = ve[j]+p->info;} } if (countadjvex; dut=p->info; //dut if (vl[k]-dut < vl[j]) vl[j] = vl[k]-dut; }7.5.2

    1

    7 *

    for (j=0; jnextarc) { k=p->adjvex;dut=p->info; ee = ve[j]; el = vl[k]-dut; tag = (ee==el) ? '*' : ' '; printf(j, k, dut, ee, el, tag); // } return OK;} // CriticalPath7.5.2

    1

    7 *

    7.5.2 Ve[i]Vl[i], O(n+e) e[k]l[k]O(e) O(n+e)

    1

  • 7.1 7.2 7.3 7.4 7.5 7.6

    1

  • A B Email,AB 7.6

    1

    7 *

    7.6 7.6.1 7.6.2

    1

    7 *

    7.6.1 GviviG

    1

    7 *

    v0v2v4v1v33262534 Dijkstrav7.6.1

    1

    7 *

    D[5]P[5] 1 5 2 6 2 7 2 0 1 2 3 4final[5]7.6.1 v0v2v4v1v33262534

    0636060

    -100-1-1

    10000

    1

    7 *

    D[5]P[5] 1 1 1 0 1 2 3 4final[5]7.6.1 v0v2v4v1v33262534

    05367

    -12022

    10100

    1

    7 *

    DviS={vi}DvviD[i]viS7.6.1

    1

    7 *

    (1)arcsarcs[i][j]S={vi}DvviD[i](2)vjvjvjS7.6.1

    1

    7 *

    (3)vV-SvkD[j]+arcs[j][k]