Sponsored Links
This presentation is the property of its rightful owner.
1 / 109

第七章 图 PowerPoint PPT Presentation


  • 94 Views
  • Uploaded on
  • Presentation posted in: General

理解图的基本概念及有关术语,掌握图的四种存储结构的表示方法; 熟练掌握图的两种遍历(深度优先搜索和广度优先搜索),能列出按上述两种遍历算法得到的序列; 理解最小生成树的概念,能按 Prim 算法构造最小生成树; 掌握求最短路径、拓扑排序以及关键路径的算法思想。. 第七章 图. 学习要点. 7.1 图的的定义和术语. 图的定义. 图是由 一个 顶点集 V 和 一个描述顶点之间关系(边或者弧)的集合 R 构成的数据结构。 Graph = ( V , VR ) 其中, VR = {<v,w>| v,w∈V 且 P(v,w)}

Download Presentation

第七章 图

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Prim


7.1

VR

Graph = ( V , VR )

VR{<v,w>| v,wV P(v,w)}

<v,w> v w v w

P(v,w) <v,w>


V0

V1

V2

V3

V1

V0

V2

V4

V3

1

2

3


V1

V0

V2

V4

V3

x,yy,x

G1=<V1, E1>

V1={v0, v1, v2, v3, v4 }

E1={(v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3),(v2,v4)}


V0

V1

V2

V3

<x,y><y,x><x,y>xyxy

G2=<V2, A2>

V2={v0, v1, v2, v3}

A2={<v0,v1 >, <v0,v2 >, <v2,v3 >, <v3,v0 >}



W

V

<v,w>VR,<v,w>vwv,w

<v,w>VR<w,v>VRVR(v,w)vw

W

V


2

2

1

3

1

3

,


1

5

7

2

4

5

3

2

4

6

1

3

6

VVVV


2

B

A

1

4

1

3

3

4

1

5

5

5

6

3

2

8

C

4

2

7

(b)

(a)


V1

V1

V0

V2

V0

V4

V3

vv`(v=vi,0,vi,1,,vi,m=v`)(vi,j-1,vi,j)E(G)


V0

V1

V2

V3

V1

V0

V2

V4

V3

G1

G2


V1

V1

V0

V0

V2

V4

V3

V3

V1

V0

V2

V4

V3

GG`G=(V,E),G`=(V`,E` ) V`V,E`EV`V, E`EG`G

(b)(c) (a)

(a)

(b)

(c)


V0

V4

V3

V0

V2

V3

V5

V4

G2

V2

V1

V1

Gvv`vv`G

G1

G2


V3

V1

V0

V2

V2

V1

V3

V3

V2

V1

V0

V0

Gvjvi vjvivi vj

G1

G2

G2


V0

V4

V3

V0

V4

V3

V0

V4

V3

V2

V2

V2

V1

V1

V1

GGn Gn-1

G

nmn-m

G1

G1


2

4

5

1

3

6

1

5

7

2

4

6

3

123563

5

1235

1235631

3563

G1

12576523

7

12576

12576521

1231

G2


7.2


1 (vi,vj)<vi,vj>E(G)

0 (vi,vj)<vi,vj>E(G)

A[i][j]=

7.2.1

G(V, E)nV{v0,v1,, vn-1} Gnn


V0

V1

V2

V3

V1

V0

V2

V3

V4

7.2.1

A=

B=


5

V3

V0

7

6

8

V4

3

V1

V2

9

4

7.2.1

G

wij(vi,vj)<vi,vj>E(G)

(vi,vj)<vi,vj>E(G)

wij

A[i][j]=

C=


7.2.1

  • ii 1i

  • 1

  • ij(ij1)


7.2.1

  • i 1i

  • i1 i

  • 1

  • ij


7.2.1

,,

#define INFINITY 1000

#define MAX_VERTEX_NUM 20


7.2.1

typedef char VertexType; //

typedef int VRType; //

typedef struct {

VertexType vexs[MAX_VERTEX_NUM];

//

VRTypearcs [MAX_VERTEX_NUM] [MAX_VERTEX_NUM];

//

int vexnum, arcnum; //

} MGraph;


7.2.2

Gvivivi


ViVi

data

firstarc


4

4

0

1

3

0

V1

V0

1

3

2

V2

2

V3

V4

1

2

link

ne

n2e

Vi TD(Vi)=i


#define MAX_VER_NUM 20

typedef struct ArcNode{

int adjvex;

struct ArcNode *next;

}ArcNode;

typedef struct VNode{

VertexType data;

EdgeNode *firstedge;

}Vnode,AdjList[MAX_VERTEX_NUM];

typedef struct{

AdjList vertices;

int vexnum,arcnum;

}ALGraph;


0

V0

V1

V2

V3

1

2

3

n,e,n,e

,iviivi


2

V0

V1

V2

V3

3

0

0

vivivi


  • 2


  • ,

  • ij


7.2.3


#define MAX_VERTEX_NUM 20

typedef struct ArcBox {

int tailvex,headvex;

struct ArcBox *hlink,tlink;

}ArcBox;

typedef struct VexNode {

VertexType data;

ArcBox *fisrtin, firstout;

}VexNode;

typedef struct {

VexNode xlist[MAX_VERTEX_NUM];

int vexnum,arcnum;

}OLGraph;


2

1

3

4

1 2

1 3

1

1

2

2

3

3

3 1

3 4

4

4

4 3

4 1

4 2

= =

Vihlink

Vitlink

hlink

tlink

^

^

^

^

^

^

^

^


mark

jlink

ivex

ilink

jvex

data

firstedge

7.2.4


2

1

3 2

5 2

3 5

3 4

1 4

1 2

1

1

2

2

3

3

3

4

5

4

4

5

5

^

^

^

^

^

ne


#define MAX_VERTEX_NUM 20

typedef emnu{ unvisited,visited} VisitIf;

typedef struct EBox{

VisitIf mark;

int ivex,jvex;

struct EBox *ilink, *jlink;

}EBox;

typedef struct VexBox{

VertexType data;

EBox *fistedge;

}VexBox;

typedef struct{

VexBox adjmulist[MAX_VERTEX_NUM];

int vexnum,edgenum;

}AMLGraph;

/**/

/**/

/**/

/**/

/**/



7.3

visited01


7.3.1

GGv

  • vvisited[v]=TRUE

  • vwwwwwv

  • v


V0

V7

V6

V5

V4

V3

V2

V1

v

  • v

  • v

DLR


V1

V2

V3

V4

V5

V6

V7

V8

V1

V2

V3

V4

V5

V6

V7

V8

V1 V2 V4 V8 V5 V6 V3 V7

,

V1 V2 V4 V8 V3 V6 V7 V5


Boolean visited[MAX];

void DFSTraverse(Graph G,int v){

for(v=0;v<G.vexnum;++v)

visited[v]=FALSE;

for(v=0;v<G.vexnum;++v)

if(!visited[v])

DFS(G,v);

}

//

//

//DFS


vGDFS

void DFS (Graph G,int v){

visited[v]=TRUE;

for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))

if (!visited[w])

DFS (G,w);

}

//v

//v

wDFS


V0

V1

V2

V3

V4

V5

V6

V7

0

1

2

3

4

5

6

7

4

0

7

1

2

3

0

5

6

1

6

7

3

2

2

4

1

5

V1

V7

V6

V5

V2

V3

V4

V0

V0

V1

V3

V7

V4

V2

V5

V6

V0

V1

V2

V3

V4

V5

V6

V7


DFS


0

1

2

3

O(n2)n

O(e)eO(n+e)


V1

V2

V3

V4

V5

V6

V7

V8

7.3.2

GG v

  • vvisited[v]=TRUE

  • vW1W2Wt

  • W1W2Wt

vv12


V1

V4

V5

V6

V7

V2

V3

V0

V1

V7

V6

V5

V2

V3

V0

V4

G V0

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

,


V0

V7

V6

V5

V4

V3

V2

V1

  • v

  • v ()

  • vw1,w2,wk()

  • (2);

  • 3)2

Q


V1

V2

V3

V4

V5

V6

V7

V8

V1

V2

V3

V4

V5

V6

V7

V8

V1 V2 V3 V4 V5 V6 V7 V8

V1 V2 V3 V4 V6 V7 V8 V5


v,

v

Y

a

N

w,

v

vw

w

N

w

vw

Y

Y

w

N

a


void BFSTraverse(Graph G,int v){

for(v=0;v<G.vexnum;++v) visited[v]=FALSE;

InitQueue(Q);

for(v=0;v<G.vexnum;++v)

if(!visited[v]){

visited[v]=TRUE;

EnQueue(Q,v);

while(!QueueEmpty(Q)){

DeQueue(Q,u);

for (w=FisrtAdjVex(G,u);w>=0;

w=NextAdjVex(G,u,w))

if(!visited[w]){

visit(w);EnQueue(Q,w);

}

}

}

}

v

v

u

wu


V0

vextex

firstedge

adjvex

next

^

0

v0

V1

V2

V3

v1

1

^

V4

2

v2

^

4

3

4

4

0

0

2

0

3

1

1

2

3

v3

^

4

v4

^

V0

V3

V2

V1

V4


f

f

v3

v3 v2

1 2 3 4 5 6

1 2 3 4 5 6

f

r

r

v0

v0 v3

v0 v3 v2

1 2 3 4 5 6

f

f

f

r

v3 v2 v1

v0

v2 v1

v2 v1 v4

1 2 3 4 5 6

1 2 3 4 5 6

1 2 3 4 5 6

r

r

r

v0 v3 v2 v1

v0 v3 v2 v1

v0 v3 v2 v1 v4

f

f

f

v1 v4

v4

1 2 3 4 5 6

1 2 3 4 5 6

1 2 3 4 5 6

r

r

r

v0 v3 v2 v1 v4

v0 v3 v2 v1 v4

v0 v3 v2 v1 v4


V0

V4

V3

V0

V2

V3

V5

V4

V7

V6

V2

V1

V1

7.4


B

A

C

D

E

F

0

A

^

4

1

2

5

3

5

1

4

0

B

1

0

^

2

^

C

3

D

^

4

E

^

5

F

^

7.4.1

DFSA C

A B F E C D


void Traver (Graph G){

for (v=0;v<G.vexnum;++v) visited[v]=FALSE;

for (v=0;v<G.vexnum;++v)

if (!visited[v]) DFS (G,v);

}

{ Count++; }

count0forDFScount1count


GG`E(G`)G`G

nmmn-m


V0

V1

V2

V3

V4

V5

V6

V7

E(G)GE(G)T(G)B(G)T(G)B(G)T(G)GG

GG G


V0

V0

V0

V1

V1

V1

V2

V2

V2

V3

V3

V3

V4

V4

V4

V5

V5

V5

V6

V6

V6

V0

V7

V7

V7

V0

V1

V2

V1

V2

V3

V5

V3

V4

V5

V6

V7

V6

V7

V4

V0 V1 V3 V7 V4 V2 V5 V6

V0 V1 V2 V3 V4 V5 V6 V7


A

B

C

D

E

F

G

H

I

K

J

G

D

A

L

M

K

I

E

L

C

F

H

M

B

J


DFS,DFS(i)DFS(j),(i,j),DFS(j)

ADFSTreeBA


void DESForest(Graph G,CSTree &T) {

T=NULL;

for (v=0;v<G.vexnum;++v)

visited[v]=FALSE;

for(v=0;v<G.vexnum;++v)

if (!visited[v]){

p=(CSTree)malloc(sixeof(CSNode));

*p={GetVex(G,v).NULL,NULL};

if (!T)T=p;

else q->nextsibling=p;

q=p;

DFSTree(G,v,p);

}

}

A:

v

p


B

vG,T

void DFSTree(Graph G,int v,CSTree &T){

visited[v]=TRUE; first=TRUE;

for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))

if(!visited[w]){

p=(CSTree)malloc(sizeof)CSNode));

*p=(GetVex(G,w),NULL,NULL);

if (first){

T->lchild=p; first=FALSE;

}elseq->nextsibling=p;

q=p;

DFSTree(G,w,q);

}

}

wvv

wv

w


  • :

      • nn-1

    • nn-1


7

7

5

9

13

24

10

17

12

18

1

2

6

5

3

4

7.4.3

1

n


7

7

5

9

13

24

10

17

12

18

1

2

6

5

3

4

2

nn(n-1)/2

nn-1

n-1

3

G


V1

V1

V1

5

6

1

1

1

V2

V4

5

5

V3

V3

V3

3

2

4

4

6

6

V6

V5

V6

V1

V1

V1

1

1

1

V4

V2

V4

V2

V4

5

5

V3

V3

V3

2

3

2

2

4

4

4

V6

V5

V6

V6

Prim

V1


(Prim)

Prim

1U{u1}T={ }

2while UVdo

uvmin{wuvuUvVU }

TT{uv}

UU{v}

3


V1

5

6

1

V2

V4

5

5

V3

3

2

4

6

6

V5

V6

closedge,

lowcostV-UU

adjvex

U


(Prim)

  • void Prim(Mgraph G,VertexType u){

  • k=LocateVex(G,u);

  • for(j=0;k<G.vexnum;++j)

  • if(j!=k) closedge[j]={u,G.arcs[k][j]};

  • closedge[k].lowcost=0;

  • for (i=1;i<G.vexnum;++i){

  • k=minmum(closedge);

  • printf(closedge[k].adjvex,G.vexs[k]);

  • closedge[k].lowcost=0;

  • for (j=0;j<G.vexnum;++j)

  • if (G.arcs[k][j]<colsedge[j].lowcost)

    • closedge[j]={G.vexs[k],G.arcs[k][j]};

  • }

  • }

  • U={u}

    kU

    U


    1

    5

    6

    1

    2

    4

    5

    5

    3

    3

    2

    4

    6

    6

    5

    6

    (Kruskal)

    • G = (V,E) n G`=(U,T)G UVGT

    • GG`TG`G`Tn-1T


    A

    D

    E

    3

    F

    G

    2

    4

    B

    C

    8

    9

    4

    1

    9

    7

    5

    8

    6

    1

    1)

    2)


    7.5

    DAGDAG

    DAG


    ((a+b)(b(c+d))+(c+d)e)((c+d)e)



    7.5.1

    (Activity On Vertex network )AOV


    V0

    V3

    V1

    V2

    AOVViVj

    < Vi, Vj>,ijViVjViVjVjVi

    AOVAOV

    AOV


    C4

    C5

    C1

    C2

    C3

    C4

    C5

    C6

    C7

    C8

    C9

    C10

    C11

    C12

    C1

    C1,C2

    C1

    C3,C4

    C11

    C5,C3

    C3,C6

    C9

    C9

    C9,C10,C1

    C2

    C1

    C3

    C7

    C12

    C10

    C9

    C8

    C6

    C11


    C4

    C5

    C2

    C1

    C3

    C7

    C12

    C10

    C9

    C8

    C6

    C11

    AOV()

    AOVAOVGAOV

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

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


    AOV

    0

    0


    V1

    V2

    V2

    V2

    V5

    V3

    V6

    V4

    V1

    V4

    V3

    V4

    V3

    V3

    V6

    V5

    V6

    V5

    V6

    V5

    V2

    V2

    V3

    V5

    V5

    AOV

    V2

    V1,V4,V6,V3,V5,V2


    0

    1

    V1

    V2

    2

    3

    V4

    V3

    4

    5

    3

    1

    4

    4

    4

    2

    1

    3

    data

    firstarc

    adjvex

    nextarc

    V6

    V5

    ^

    v1

    ^

    v2

    ^

    v3

    v4

    ^

    ^

    v5

    ^

    v6


    Status Topo_Sort (AlGraph G){

    FindInDegree(G,indegree);

    InitStack(S);

    for (i=0;i<G.vexnum;++i)

    if (!indegree[i])Push(S,i);

    count=0;

    while(!StackEmpty(S)){

    Pop(S,i);

    printf(i,G->vertices[i].data);

    ++count;

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

    k=p->adjvex;

    if(!(--indegree[k])) Push(S,k);

    }

    }

    if(count<G.vexnum) return ERROR;

    else return OK;

    }


    void FindInDegree(ALGraph G,int indegree[MAX]);

    for (i=0;i<G.vexnum;++i)

    indegree[i]=0;

    for (i=0;i<G.vexnum;++i){

    p=G.vertices[i].firstarc;

    while(p){

    indegree[p->adjvex]++;

    p=p->nextarc;

    }

    }

    }

    i

    i1

    i


    7.5.2

    1AOE

    , , (), AOE (Activity On Edges)

    AOE


    a10=2

    a4=1

    a7=9

    a1=6

    a2=4

    a8=7

    a11=4

    a5=1

    a3=5

    a9=4

    a6=2

    V7

    V2

    V9

    V1

    V5

    V8

    V3

    V4

    V6

    119

    V1

    V9

    : (1)

    (2)


    2

    a4=2

    a1=6

    a2=4

    1

    4

    a5=1

    3

    • 2

    • AOE

    • Ve(j)Vj

    • Vl(i)Vi

    • e(k)ak

    • l(k)ak

    • l(k)-e(k)ak

    • l(k)=e(k)


    k

    i

    j

    3

    e(k)=l(k)

    ak<i,j>dut(<i,j>)

    1e(k)=Ve(i)

    2l(k)=Vl(j)-dut(<i,j>)

    (1) Ve(0)=0Vj

    (2) Vl(n-1)=Ve(n-1)


    k

    i

    j

    ake(k)ak<i,j>e(k)V0Vi e(k)=Ve(i)

    akl(k)VjVl(j)akak<i,j>akdut(<i,j>) l(k)=Vl(j)-dut(<i,j>)

    aks(k)akl(k)e(k)0


    a10=2

    a4=1

    a7=9

    a1=6

    a2=4

    a8=7

    a11=4

    a5=1

    a3=5

    a9=4

    a6=2

    e(k) l (k) l(k)-e(k)

    7

    0

    16

    6

    4

    0

    5

    7

    7

    0

    14

    6

    14

    3

    0

    8

    2

    6

    7

    16

    7

    10

    2

    0

    2

    0

    3

    0

    0

    3

    0

    3

    0

    Ve(j) Vl(i)

    V7

    V2

    V9

    V1

    V5

    V8

    V3

    V4

    V6

    4

    • Ve(j)

    • Vl(i)

    • e(k)

    • l(k)

    • l(k)-e(k)

    a1

    a2

    a3

    a4

    a5

    a6

    a7

    a8

    a9

    a10

    a11

    V1

    V2

    V3

    V4

    V5

    V6

    V7

    V8

    V9

    0

    6

    4

    5

    7

    7

    16

    14

    18

    0

    6

    6

    8

    7

    10

    16

    14

    18


    Status Topo_Order(AlGraph G,Stack &T){

    FindInDegree(G,indegree); InitStack(S);

    InitStack(T); count=0; ve[0..G.vexnum-1]=0

    for (i=0;i<G.vexnum;++i)

    if (!indegree[i])Push(S,i);

    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])) Push(S,k);

    if(ve[j]+p->weight>ve[k])

    ve[k]=ve[j]+p->weight;

    }

    }

    if(count<G.vexnum) return ERROR;

    else return OK;

    }


    Status CriticalPath(AlGraph G){

    if(!Topo_Order(G,T)) return ERROR;

    vl[G.vexnum-1]= ve[G.vexnum-1];

    while(!StackEmpty(T))

    for(Pop(T,j), p=G.vertices[j].firstarc;p;p=p->nextarc){

    k=p->adjvex; dut=p->weight;

    if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut;

    }

    for(j=0;j<G.vexnum;++j)

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

    k=p->adjvex; dut=p->weight;

    ee=ve[j];el=vl[k]-dut;

    tag=(ee==el)?`*`:``;

    printf(j,k,dut,ee,el,tag);

    }

    }


    ,,

    a10=2

    7

    2

    a4=1

    a7=9

    a1=6

    9

    a2=4

    a8=7

    1

    a5=1

    5

    a11=4

    8

    a3=5

    3

    a9=4

    a6=2

    4

    6

    5


    7.6

    AB


    v1

    0

    v2

    32

    13

    <V0,V1>

    8

    1

    8

    13

    <V0,V2>

    2

    13

    <V0,V2,V3>

    7

    6

    9

    5

    30

    19

    <V0,V2,V3,V4>

    3

    21

    <V0,V2,V3,V4,V5>

    5

    17

    6

    2

    20

    <V0,V1,V6>

    4

    7.6.1

    v


    () v1()


    :

    () v1v2 ()

    ()


    DistDist[k] k

    • Dist[k] = < k >

      • = <>

  • + < k >


  • 1

    V0Vi

    V0Vi

    2Dist[k]

    w

    Dist[w]+G.arcs[w][k]<Dist[k]

    Dist[k] Dist[w]+G.arcs[w][k]


    0

    32

    8

    1

    13

    2

    6

    7

    30

    9

    5

    3

    5

    17

    6

    2

    4

    V0

    -------

    -------

    -------

    19

    <V0,V2,V3,V4>

    22

    <V0,V1,V5>

    20

    <V0,V1,V6>

    V4:19

    <V0,V2,V3,V4>

    13

    <V0,V1>

    -------

    13

    <V0,V2,V3>

    30

    <V0,V4>

    32

    <V0,V6>

    V1:13

    <V0,V1>

    -------

    -------

    13

    <V0,V2,V3>

    30

    <V0,V4>

    22

    <V0,V1,V5>

    20

    <V0,V1,V6>

    V3:13

    <V0,V2,V3>

    --------

    --------

    --------

    --------

    21

    <V0,V2,V3,V4,V5>

    20

    <V0,V1,V6>

    V6:20

    <V0, V1,V6>

    13

    <V0,V1>

    8

    <V0,V2>

    30

    <V0,V4>

    32

    <V0,V6>

    V2:8

    <V0,V2>

    V1

    V2

    V3

    V4

    V5

    V6

    Vj


    7.6.2

    G=(V,E),Guv(uv),uvvu

    :,n,,O(n3)

    (Floyd),O(n3),n


    G.arcs[N][N]:

    N*ND[N][N]0D[i][j]ij

    , D[i][j]=G.arcs[i][j],


    0D[i][j]D[i][0]+D[0][j]D[i][j].

    1D[i][j]D[i][1]+D[1][j]D[i][j] n D[i][j] ,, D[i][j]ij

    :

    D(-1)[i][j]=G.arcs[i][j]; //G.arcs

    D(k)[i][j]=min{D(k-1) [i][j], D(k-1) [i][k]+D(k-1) [k][j]}

    k=0,1,2,, n-1


    6

    A

    B

    4

    11

    3

    2

    C


    25

    V2

    V5

    10

    16

    7

    V1

    V4

    12

    3

    10

    12

    2

    V3

    V6

    8

    4

    1)v1


  • Login