第七章 图

download 第七章 图

If you can't read please download the document

description

第七章 图. 本章重点难点. 重点 : 图的存储结构、遍历、最小生成树拓扑排序以及关键路径的基本思想和算法实现。. 难点 :最小生成树、拓扑排序和关键路径算法。. 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 ( 连通网的 ) 最小生成树 7.5 重(双)连通图和关节点 7.7 拓扑排序 7.8 关键路径. 7.1 图的定义和术语. 图 : 由一个 顶点集 V 和一个 弧集 R 构成的数据结构 。 Graph = (V , R ) - PowerPoint PPT Presentation

Transcript of 第七章 图

  • 7.1 7.2 7.3 7.4 ()7.5 7.7 7.8

  • : V R Graph = (V , R )VR{| v,wV P(v,w)} v w v w P(v,w) 7.1

  • AB E C D:G1 = (V1, VR1)V1={A, B, C, D, E}VR1={, , , , , , }7.1

  • VR VR, (v,w) v w B C

    A D

    F E: G2=(V2,VR2)V2={A, B, C, D, E, F}VR2={, , , , , , }7.1

  • 7.1

  • ABECFAEABBCG=(V,{VR}) G=(V,{VR}), VV, VRVR, G G 1597211132 7.1

  • n e e=n(n-1)/2 e=n(n-1) e
  • v w v w ACDFE:ID(B) = 3ID(A) = 2 (v,w) v w v B7.1

  • : vABECF: v(TD)=(OD)+(ID):ID(B) = 2OD(B) = 1TD(B) = 37.1

  • G=(V,{VR}){ u=vi,0,vi,1, , vi,m=w}(vi,j-1,vi,j)VR 1jm,u w ABECF:3{A,B,C,F}::7.1

  • GBACDFEBACDFE7.1

  • ABECFABECF7.1

  • n e n-1 n BACDFE7.1

  • 7.1

  • CreatGraph(&G, V, VR): // (V, VR) DestroyGraph(&G): // 7.1

  • LocateVex(G, u); // Gu // GetVex(G, v); // v PutVex(&G, v, value); // v value7.1

  • FirstAdjVex(G, v); // v // G NextAdjVex(G, v, w); // v w // w v // 7.1

  • InsertVex(&G, v); //GvDeleteVex(&G, v); // Gv7.1

  • InsertArc(&G, v, w); // GG //DeleteArc(&G, v, w); //GG //7.1

  • DFSTraverse(G, v, Visit()); //vG//VisitBFSTraverse(G, v, Visit()); //vG//Visit7.1

  • 7.2.1 7.2.2 7.2.3 7.2.4 7.2

  • Aij={0 (i,j)VR1 (i,j)VRBACDFE:7.2.1 ()

    0

    1

    0

    0

    1

    0

    1

    0

    0

    0

    1

    0

    0

    0

    0

    1

    0

    1

    0

    0

    1

    0

    0

    1

    1

    1

    0

    0

    0

    0

    0

    1

    1

    1

    0

    0

  • ABECF7.2.1 ()

    0

    1

    0

    0

    1

    0

    0

    1

    0

    0

    0

    0

    0

    1

    0

    1

    1

    0

    0

    0

    0

    0

    1

    0

    0

  • typedef struct ArcCell { // VRType adj; // VRType // 10 // InfoType *info; // } ArcCell, AdjMatrix[MAX_VERTEX_NUM] [MAX_VERTEX_NUM];7.2.1 ()

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

  • 0 A 1 41 B 0 4 52 C 3 53 D 2 54 E 0 15 F 1 2 3BACDFE7.2.2

  • 1 4230 120 1 2 3 4 A B C D EABECF7.2.2

  • ABECDA B C D E 303420012347.2.2

  • typedef struct ArcNode { int adjvex; // struct ArcNode *nextarc; // InfoType *info; // } ArcNode;adjvex nextarc info7.2.2

  • typedef struct VNode { VertexType data; // ArcNode *firstarc; // } VNode, AdjList[MAX_VERTEX_NUM]; data firstarc7.2.2

  • typedef struct { AdjList vertices; int vexnum, arcnum; int kind; // } ALGraph;7.2.2

  • typedef struct ArcBox { // int tailvex, headvex; InfoType *info; struct ArcBox *hlink, *tlink; } VexNode;7.2.3

  • typedef struct VexNode { // VertexType data; ArcBox *firstin, *firstout; } VexNode;7.2.3

  • typedef struct { VexNode xlist[MAX_VERTEX_NUM]; // () int vexnum, arcnum; //} OLGraph;()7.2.3

  • typedef struct Ebox { VisitIf mark; // int ivex, jvex; // struct EBox *ilink, *jlink; InfoType *info; // } EBox;7.2.4

  • typedef struct { // VexBox adjmulist[MAX_VERTEX_NUM]; int vexnum, edgenum; } AMLGraph;typedef struct VexBox { VertexType data; EBox *firstedge; // } VexBox;7.2.4

  • 7.3.1 7.3.2 7.3.3 7.3

  • :V0 V0V07.3.1

  • Vw1SG1SG2SG3W1W2W3 V SG1SG2 SG3 W1W2W3 V for (W1W2W3 ) W w2w3w27.3.1

  • :1. visited[w]2. V7.3.1

  • 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

  • : FALSE, 7.3.1

  • void DFSTraverse(Graph G, Status (*Visit)(int v)) { // G VisitFunc = Visit; for (v=0; v
  • abchdekfgF F F F F F F F FTTTTTTTTTachdkfe bgachkfedbg::7-1:0 1 2 3 4 5 6 7 87.3.1

  • Vw1w8w3w7w6w2w5w4V V->w1, V->w2, V->w8 1V->w7, V->w3, V->w5 2V->w6, V->w4 3w1Vw2w7w6w3w8w5w47.3.2

  • V0V0V0 7.3.2

  • void BFSTraverse(Graph G, Status (*Visit)(int v)){ for (v=0; v
  • visited[u] = TRUE; Visit(u); // uEnQueue(Q, v); // vwhile (!QueueEmpty(Q)) { DeQueue(Q, u); // u for(w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G,u,w)) if ( ! visited[w]) { visited[w]=TRUE; Visit(w); EnQueue(Q, w); // w } // if} // while7.3.2

  • 1. i s 2. 7.3.4

  • 1. i s abchdekfg b k b : a: b a d h c e k f g c: b c h d a e k f g7.3.4

  • 1. i s , i s 2. :3. 7.3.4

  • void DFSearch( int v, int s, char *PATH) { // vG // vsPATH visited[v] = TRUE; // v Append(PATH, getVertex(v)); // v for (w=FirstAdjVex(v); w!=0&&!found; w=NextAdjVex(v) ) if (w=s) { found = TRUE; Append(PATH, w); } else if (!visited[w]) DFSearch(w, s, PATH); if (!found) Delete (PATH); // v }7.3.4

  • 2. ?7.3.4

  • abchdekfg7.3.4

  • : 3 5 : 3 1 2 4 7 5 Q.front Q.rear3214756897.3.4

  • 1) next priou2) priou3) 7.3.4

  • typedef DuLinkList QueuePtr; void InitQueue(LinkQueue& Q) { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); Q.front->next = Q.rear->next = NULL}void EnQueue( LinkQueue& Q, QelemType e ) { p = (QueuePtr) malloc (sizeof(QNode)); p->data = e; p->next = 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->data}7.3.4

  • n n n-17.4 ()

  • e n-1 7.4 ()

  • : v w w v v w n-1 7.4 ()

  • abcdegf7-2:195141827168213ae12dcbgf7148531621= 14+8+3+5+16+21 = 677.4 ()

  • n U V-U UV-U :7.4 ()

  • VUUstruct { VertexType adjvex; // U VRType lowcost; // } closedge[MAX_VERTEX_NUM];7.4 ()

  • abcdegf195141827168213ae12dcb7aaa191418147-3:e12ee8168d3dd7213c557.4 ()

    closedge

    0

    1

    2

    3

    4

    5

    6

    Adjvex

    Lowcost

  • void MiniSpanTree_P(MGraph G, VertexType u) { //uG k = LocateVex ( G, u ); for ( j=0; j
  • : n SGSG SG n-1 : 7.4 ()

  • k = minimum(closedge); // (k) printf(closedge[k].adjvex, G.vexs[k]); // closedge[k].lowcost = 0; // kU for (j=0; j
  • abcdegf195141827168213ae12dcbgf71485316217-4:71218197.4 ()

  • O(n2)O(eloge)7.4 ()

  • : ST=( V,{ } ); k = i = 0; // k while (k
  • 7.5

  • 7.5

  • ahgcbfdeabcdefgh1234567833111111: a c 7.5

  • V07.5

  • () 7.5

  • 1) V0 p = G.vertices[0].firstarc; v = p->adjvex; DFSArticul(G, v); // v if (count < G.vexnum) { // printf (0, G.vertices[0].data); // 7.5

  • 2) : low(v) = Min{visited[v], low[w], visited[k] } : w v k v visited vw low[w] visited[v] v7.5

  • 1visited[v]count 2 low[v]=Min{visited[v],low[w],visited[k]}3low[w]visited[v]?7.5

  • for(p=G.vertices[v0].firstarc; p; p=p->nextarc) {

    }void DFSArticul(ALGraph G, int v0) { // v0 G, //

    } // DFSArticulmin =visited[v0] = ++count; // v0count, low[v0]min // v0low[v0] = min;7.5

  • w = p->adjvex; // wv0 if (visited[w] == 0) { // w DFSArticul(G, w); // low[w]

    } else // wif (low[w] < min) min = low[w]; if (low[w]>=visited[v0]) printf(v0, G.vertices[v0].data); //if (visited[w] < min) min = visited[w];7.5

  • 1. 2. 7.6

  • 1. : v1vv27.6

  • () v1()7.6

  • : () v1()v2 () 7.6

  • Dist[k] = = + DistDist[k] k 7.6

  • 12Dist[k]u Dist[u]+G.arcs[u][k]
  • vi vj 7.6

  • {vi,vj} // ,{vi,v1,vj} // 1{vi,,v2}, {v2,,vj} {vi, , v2, vj} // 2 vi vj 7.6

  • : 7.7

  • 7.7

  • BDAC {B, C, D}7.7 {B, C, D}

  • BDAC A B C D A C B D7.7

  • 7.7

  • abcghdfeabhcdgfe 17.7

  • v;while (v0) { printf(v); ++m; w:=FirstAdj(v); while (w0) { inDegree[w]--; w:=nextAdj(v,w); } v;}if m
  • CountInDegree(G,indegree); //InitStack(S);for ( i=0; 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 (!indegree[w]) Push(S, w); // }}if (count
  • abcdefghk64521187244: 61747.7

  • : 7.8

  • () ve(j)ve(j) = j() vl(k) vl(k) = k7.8

  • i i () ee(i) ee(i) = ve(j) () el(i) el(i) = vl(k) dut()7.8

  • ve() = 0 ve(k) = Max{ve(j) + dut()}

    vl() = ve() vl(j) = Min{vl(k) dut()}7.8

  • abcdefghk6452118724400000000064571157151418181818181818181818161486610807: a - d - f - c - b - e - h - g - k7.8

    a

    b

    c

    d

    e

    f

    g

    h

    k

    ve

    vl

  • 06457715141818141610786600006457771514141602366887107.8

    a

    b

    c

    d

    e

    f

    g

    h

    k

    ve

    vl

    ab

    ac

    ad

    be

    ce

    df

    eg

    eh

    fh

    gk

    hk

    6

    4

    5

    1

    1

    2

    8

    7

    4

    2

    4

    e

    l

  • 1. 2.

  • :ve vl.7.8

  • 3. 4.