第七章 图

  • Upload
    idana

  • View
    31

  • Download
    2

Embed Size (px)

DESCRIPTION

第七章 图. 学习要点 1 .熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采用何种存储结构和算法有密切联系; 2 .熟练掌握图的两种遍历:深度优先遍历和广度优先遍历的算法。在学习中应注意图的遍历算法与树的遍历算法之间的类似和差异。树的先根遍历是一种深度优先搜索策略,树的层次遍历是一种广度优先搜索策略 3 .理解各种图的算法;.  第七章 图 7 .1 图的基本概念 7 .2 图的存储结构 7 .3 图的遍历 7 .4 生成树 7 .5 拓扑排序 7 .6 关键路径 - PowerPoint PPT Presentation

Citation preview

  • 1 2 3

  • 7.1 GG= VEG1=V={v0 ,v1,v2,v3,v4 }E={(v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3)(v2,v4)}G1(vi,vj)vivj

  • G2 vivjvivjGGGGGGG2=V={v0 v1,v2,v3}E={ , , ,}

  • 1 2 3 4

  • 1 ,vu e= (v, u), vu e 2 V = V V=V V=V V = V+V Gne = 2*e 2 e

  • n(n-1)n~ n(n-1)/2 n~ ~ ~

  • 4 V={Vi0,Vi1,Vin} (Vij-1,Vij)E E,(1
  • 5 , G1V0,V1,V2,V3 G2 V0,V2,V3,V0G1G2

  • 6 G=< V, E > vu v u G

  • 7 G=VEG1=V1E1V1 VE1 E G1G (b)(c) (a) (a)(b)(c)

  • 8 G G G G

  • D D DD

  • G1G1T1G1n-19

  • G1V(G1)={1,2,3,4,5,6} E(G1)={, , , , , , }G2V(G2)={1,2,3,4,5,6,7} E(G1)={(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7)}

  • 341310

  • 123563 1235631 3563125765237 12576521512356125761231

  • 7.2

  • G=(V,E)n1GAn

  • nn(n+1)/2nnViTD(Vi)Ai(i)ViAiViAi A0 00

  • #define n 6 /**/#define e 8 /**/typedef char vextype; /**/typedef float adjtype; /**/typedef struct{ vextype vexs[n]; adjtype arcs[n][n];} graph;

  • 21435

  • BADCE

  • 21534000000000000000000000000=807080705040503040203020arcs6203050407080

  • CREATEGRAPH(graph *ga){ int i,j,k; float w; for (i=0;ivexs[i]getchar(); /**/ for (i=0;iarcs[j][i]w; }}

  • iVi

    Vi Vj,2Vj

  • ^^^^

  • ViiViiViiv,uvuGm(mn), eGm+2*eGG

  • Vi

  • ^^^^^^^^

  • ^^^^^

  • 7.3 1)v 2)vv3)

  • v 1v 2v 1 V0,V1,V3,V7,V4,V2,V5,V6,

    1GV0 2 V0,V1,V4,V7,V3,V2,V5,V6

  • V1V3 V7 V6 V2 V5 V8 V4

  • V1V3 V7 V6 V2 V4 V8 V5

  • ,visited[Max]vivisited[i]falsevivisited[i]true void DFSTraverse (Graph G, Status( *Visit) (int v )){ VisitFunc=Visit; for ( v=0; v
  • n e v w 2e O(e)1O(n+e)O(n)O(n2)

  • V1 V2 V4 V8 V5 V6 V3 V7V1 V2 V4 V8 V5 V6 V3 V7

  • V1 V2 V4 V8 V3 V6 V7 V5

  • 1)v 2)V034)

  • vi1vi 2 vi w1 ,w2 , wk 3; 1

    G V0 V0,V1,V2,V3,V4,V5,V6,V7

  • V0V1V2V3V4V5V6V7V1V2V3V0V4V5V6V7 3(2Q1v 2vw1 ,w2 , wk 3;

  • V1 V2 V3 V4 V5 V6 V7 V8V1 V2 V3 V4 V6 V7 V8 V5

  • 1,visited[Max]2 void BFSTraverse (Graph G, Status( *Visit) (int v )){ for (v=0;v
  • d0 + d1 + + dn-1 = O(e) di i n O(n2)

  • V1 V2 V3 V4 V5 V6 V7 V8V1 V2 V3 V4 V5 V6 V7 V8V1 V2 V4 V8 V5 V6 V3 V7V1 V2 V4 V8 V5 V6 V3 V7

  • V1 V2 V3 V4 V6 V7 V8 V5V1 V2 V4 V8 V3 V6 V7 V5

  • nn-1nn-17.4

  • V1 V2 V4 V8 V5 V3 V6 V7V1 V2 V3 V4 V5 V6 V7 V8

  • nnn(n-1)/2nn-1n-1

  • (Prim)N=(V,{E})TENU={u0},(u0V), TE=uU,vV-U(u,v)E(u0,v0)(u0,v0)TEv0UU=VT=(V,{TE})N

    : 6?

  • U={ V1 }U={ V1,V3 }U={ V1,V3,V6}U={ V1,V3,V6,V4 }U={ V1,V3,V6,V4,V2 }U={ V1,V3,V6,V4,V2,V5 }

  • : G : closedge[ ]U V-UviV-U ,closedge[i-1],Closedge[i-1].lowcost=Min{cost(u,vi)| uU} Closedge[i-1].adjvexU :u,v) (u,v)TEuUvj

  • 1 1 1 1 1 1 0 6 1 5 max max 1 3 1 1 3 3 0 5 0 5 6 4U={ v1}U={ v1,v3}UUviV-U ,closedge[i-1],Closedge[i-1].lowcost=Min{cost(u,vi)| uU} Closedge[i-1].adjvexUV-U={ v2,V3,V4,V5,V6 }V-U={ v2, V4,V5,V6 }

  • 0 v1 v1 v1 0 0 0 6 1 5 max max lowcost{v1}iadjvex 0 1 2 3 4 5 Uclosedge v1 v2 v3 v4 v5 v6

  • T(n)=O(n)Void MiniSpanTree_Prim(MGrph G, VertexType u) {k=LocateVex(G, u); for (j=0; j
  • (Kruskal)N=(V,{E})nT=(V,{})ETTT

  • ijAOV(Activity On Vertex network)AOVvivjvjviAOV 7.5

  • AOV~AOVAOV

  • C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8 C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8AOV

  • 0VjVjVkVk1Vk0ntypedef struct node{ int vex; // struct node *next; //}JD;typedef struct tnode{ int vexdata; int in; // struct node *link; //}TD;TD g[M]; //g[0]

  • Status Topologicalsort(ALGraph G){ FindInDegree(G, indegree); //indegree InitStack(S); for (i=0; inextarc) { k=p->adjvex; //i1 if(! (--indegree[k])) Push(S, k); } //0 } if(count
  • 16

  • 6

  • 6

  • 6

  • 6

  • 6

  • 6

  • 6 1

  • 6 1

  • 6 14

  • 6 14

  • 6 14

  • 6 143

  • 6 143

  • 6 143

  • 6 143

  • 6 143

  • 6 1 343

  • 6 1 34

  • 6 1 34

  • 6 1 34

  • 6 1 342

  • 6 1 342

  • 6 1 342

  • 6 1 3 242

  • 6 1 3 24

  • 6 1 3 2 44

  • 6 1 3 2 4

  • 6 1 3 2 45

  • 6 1 3 2 45

  • 6 1 3 2 4 55

  • 6 1 3 2 4 5

  • T(n)=O(e)0T(n)=O(n)T(n)=O(n+e)

  • 7.6 119 V1V91 2

  • AOE(Activity On Edge)AOE~Ve(j)VjVl(j) Vje(i) ail(i) ail(i)-e(i)ai~l(i)=e(i)

  • e(i)=l(i)aidut()1e(i)=Ve(j) 2l(i)=Vl(k)-dut()Ve(j)Vl(j)

  • Ve(i)Vl(j)e(i)l(i)l(i)-e(i)V1V2V3V4V5V6V7V8V90645771614180668710161418a1a2a3a4a5a6a7a8a9a10a11

  • V1Ve[1]=0,Ve[i]VnVl[n]=Ve[n],Vl[i]VeVle[i]l[i],e[i]=l[i]typedef struct node{ int vex; // int length; struct node *next; //}JD;typedef struct tnode{ int vexdata; int in; // struct node *link; //}TD;TD g[M]; //g[0]

  • Ve[i]Vl[i]e[i]l[i],e[i]=l[i]

  • Status TopologicalOrder(ALGraph G, Stack &T){ FindInDegree(G, indegree); InitStack(T); count=0; ve[0..G.vexnum-1]=0; while (! StackEmpty(S)) { Pop(S, j); Push(T, j); ++count; for (p=G.vertices[j].firstarc; p; p=p->nextarc) { k=p->adjvex; if (--indegree[k]==0) Push(S, k); if (ve[j]+*(p->info)>ve[k]) ve[k]=ve[j]+*(p->info); } } if (count
  • 2 Status CriticalPath(ALGraph G){ if (! ToplogicalOrder(G, T)) return ERROR vl[0..G.vexnum-1]=ve[G.vexnum-1]; while (! StackEmpty(T)) for (Pop(T, j), p=G.vextices[j].firstarc; p; p=p->nextarc) { k=p->adjvex; dut=*(p->info); if (vl[k]-dutadjvex; dut=*(p->info); ee=ve[j]; el=vl[k]-dut; tag= (ee==el) ? '*:; printf(j,k,dut,ee,el, tag ); } }

  • 7.7 13

    813192120

  • (Dijkstra)V1S2V-S=TTS1V0S V0T 2 SV0 TV0S V0TVkV0Vk V0SVk

  • S={V0},T={}TTWSTWV0ViWSS=V

  • 13

    8

    30

    32

    V2:8

    13

    -------13

    30

    32

    V1:13

    -------

    -------13

    30

    22

    20

    V3:13

    -------

    -------

    -------19

    22

    20

    V4:19

    --------

    --------

    --------

    --------21

    20

    V6:20

  • ad[ ][ ]dist[ ]V0pre[ ]V0V00

  • Void ShortestPath_DIJ(Mgraph G,int v0,PathMatrix &p, shortPathTable &D){ for (v=0; v
  • 13

    8

    13

    19

    21

    20

    T(n)=O(n)

  • Dijkstran T(n)=O(n)(Floyd)n0

  • length[][]path[i][j]ViVjVjVoid ShortFloyd(Mgraph G, PathMatrix &P[], DistancMatrix &D) { for (v=0; v
  • T(n)=O(n)

  • 01(vi,vj)A[i,j]A[j,i]