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

第 5 章 图论 PowerPoint PPT Presentation


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

第 5 章 图论. 树型结构是一类非常重要的非线性结构。直观地,树型结构是 以分支关系定义的层次结构 。 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程等等。 本章将详细讨论树和二叉树数据结构,主要介绍树和二叉树的概念、术语,二叉树的遍历算法。树和二叉树的各种存储结构以及建立在各种存储结构上的操作及应用等。. 5.1 树的基本概念. 1 树的定义

Download Presentation

第 5 章 图论

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


5 4401880

5


5 4401880

5.1

1

(Tree)n(n0)Tn=0

(Root)

n>1m(m>0)T1, T2, T3Tm(Subtree)

6-1(a)

5.1.1


5 4401880

2

(1)(node)

(2)(degree)

(3)(left)

(4)

(5)

(6)

(7)(depth)

(8)

(9)(forest)


5 4401880

A

C

D

A

B

J

G

F

H

I

E

(a)

M

N

L

K

(b)

6-1

2

(node)

(degree)


5 4401880

6-1(b)A3 B2 M03

(left)0()0()

6-1(b)HIJKLMN

(child)(parent)


5 4401880

6-1(b)B CDAAB CDE FBBE F

  • 6-1(b)B CDE F

  • 11

  • l(l1)l+1

  • 6-1(b)EFGHIJ


5 4401880

pp()

ppp(ancester)

(descent)

(depth)6-1(b)4


5 4401880

(forest)m(m0)

  • 3

    • 6-1(b)

    • 6-2(a)6-1(b)

    • 6-2(b)

    • P120


5 4401880

A

D

H

I

B

J

F

(A(B(E(K,L),F),C(G(M,N)),D(H,I,J)

E

G

C

(b)

K

M

L

N

6-2

(a)


5 1 2

5.1.2

  • ADT Tree{

    • DD

    • RD

  • } ADT Tree

  • p118~119


5 4401880

5.2

5.2.1

1

(Binary tree)n(n0)n=0

(Root)

n>1T1,T2


2 5 6 3

A

A

A

A

(c)

(d)

(a)

(b)

(e)

(c)

(a)

(b)

(e)

(d)

6-3

2

56-3


5 2 2

5.2.2

1i2i-1(i1)

i=121-1=20 =1

i>1i-12(i-1)-1

i-12i-22ii-12

22i-22i-1

2k2k-1k1)


5 4401880

k

112k 2021 2k-1

20+21++2k-1=2k-1

3n02n2n0=n2+1

1n1N2N=n0+n1+n2


5 4401880

12B N=B+1

Bn1+2n2

N=B+1=n1+2n2+1

n0+n1+n2=n1+2n2+1

n0=n2+1

k2k-1(Full Binary Tree)

6-4(a)4


5 4401880

1

1

2

3

2

3

4

4

7

5

5

6

6

7

(a)

(b)

8

8

9

9

10

12

14

10

11

15

13

11

1

12

1

5

2

3

2

3

5

7

6

6

4

4

(c)

6-4


5 4401880

(Complete Binary Tree)knk1n

k1nnk

2k-1 n2k-1


5 4401880

k kk-1lll+1

4n2n+1

xx

xx

k2


5 4401880

2k-1-1<n2k-12 k-1n<2k

k1<2n<kk

k= 2n+1

5n(2n+1)12n+1),i1in)

i=1ii>1i/2

2i>ni2i

2i+1>ni2i+1


5 4401880

i=1i23

2>n2i

3>n3i

j(1ji)(2)(3)

2jn j2j2j>nj


5 4401880

  • 2j+1n j2j+12j+1>nj

  • i=j+1ij1i

  • (2j+1)+1=2(j+1)=2i

  • 6-52in2i>ni2i+12i+1n2i+1>n(2)(3)

  • (2)(3)(1)

  • i=11


  • 5 4401880

    i/2

    i

    i+1

    i

    2i

    2i+1

    i+1

    2i+2

    2i+3

    2i

    2i+1

    2i+2

    2i+3

    6-5 ii+1

    (b) ii+1

    (a) ii+1

    i>1imi(2)

    i=2m m=i/2

    i(3)

    i=2m+1 m=(i-1)/2

    i>1i/2


    5 2 3

    5.2.3

    1

    #define MAX_SIZE 100

    typedef telemtype sqbitree[MAX_SIZE];

    ii-16-6(c)

    6-6(d)


    5 4401880

    a

    a

    c

    b

    c

    b

    e

    d

    e

    g

    f

    d

    h

    h

    j

    f

    g

    k

    i

    l

    (a)

    (b)

    1 2 3 4 5 6 7 8 9 10 11 12

    a b c d e f g h i j k l

    (c)

    1 2 3 4 5 6 7 8 9 10 11

    a b c d e h f g

    (d)

    6-6


    5 4401880

    • kk2k-1

    • 2

    • (1)

      • 6-7(a)

    • typedef struct BTNode

      • { ElemType data ;

        • struct BTNode *Lchild , *Rchild ;

      • }BTNode ;


    5 4401880

    Lchild data Rchild

    Lchild data parent Rchild

    (a)

    (b)

    6-7

    • 6-7(b)

    • typedef struct BTNode_3

      • { ElemType data ;

        • struct BTNode_3 *Lchild , *Rchild , *parent ;

      • }BTNode_3 ;


    5 4401880

    T

    T

    a

    g

    e

    d

    c

    b

    a

    f

    b

    a

    c

    d

    e

    f

    g

    b

    c

    d

    f

    e

    (b)

    g

    (c)

    (a)

    6-8

    (2)

    6-8(a)6-8(b) 6-8(c)


    5 4401880

    5.3

    (Traversing Binary Tree)


    5 4401880

    • LDRDLRLDRLRDDRLRDLRLD

      • DLR()

      • LDR()

      • LRD()


    5 3 1

    5.3.1

    1

    ()

    ()


    5 4401880

    void PreorderTraverse(BTNode *T)

    { if (T!=NULL)

    { visit(T->data) ; /* */

    PreorderTraverse(T->Lchild) ;

    PreorderTraverse(T->Rchild) ;

    }

    }

    visit()T


    5 4401880

    2

    T

    p=T

    p

    q=p->Rchild qq

    p=p->Lchild p(1)(4)

    p (1)


    5 4401880

    • #define MAX_NODE 50

    • void PreorderTraverse( BTNode *T)

      • { BTNode *Stack[MAX_NODE] ,*p=T, *q ;

        • int top=0 ;

        • if (T==NULL) printf( Binary Tree is Empty!\n) ;

        • else { do

          • { visit( p-> data ) ; q=p->Rchild ;

          • if ( q!=NULL ) stack[++top]=q ;

          • p=p->Lchild ;

          • if (p==NULL) { p=stack[top] ; top-- ; }

          • }

          • while (p!=NULL) ;

          • }

    • }


    5 3 2

    5.3.2

    1

    ()

    ()


    5 4401880

    void InorderTraverse(BTNode *T)

    { if (T!=NULL)

    { InorderTraverse(T->Lchild) ;

    visit(T->data) ; /* */

    InorderTraverse(T->Rchild) ;

    }

    }/*6-8(a) cbegdfa */


    5 4401880

    2

    T

    p=T

    pp p=p->Lchild

    (p)pp

    p=p->Rchild (1)


    5 4401880

    #define MAX_NODE 50

    void InorderTraverse( BTNode *T)

    { BTNode *Stack[MAX_NODE] ,*p=T ;

    int top=0 , bool=1 ;

    if (T==NULL) printf( Binary Tree is Empty!\n) ;

    else { do

    { while (p!=NULL)

    { stack[++top]=p ; p=p->Lchild ; }

    if (top==0) bool=0 ;

    else { p=stack[top] ; top-- ;

    visit( p->data ) ; p=p->Rchild ; }

    } while (bool!=0) ;

    }

    }


    5 3 3

    5.3.3

    1

    ()

    ()


    5 4401880

    void PostorderTraverse(BTNode *T)

    { if (T!=NULL)

    { PostorderTraverse(T->Lchild) ;

    PostorderTraverse(T->Rchild) ;

    visit(T->data) ; /* */

    }

    }/*6-8(a) cgefdba */

    • nO(n)


    5 4401880

    /

    -

    +

    a

    e

    c

    f

    d

    *

    b

    6-9 (a+b*(c-d)-e/f)

    • 6-9(a+b*(c-d)-e/f)

      • -+a*b-cd/ef

      • a+b*c-d-e/f

      • abcd-*+ef/-


    5 4401880

    0

    tag=

    1

    2

    tag


    5 4401880

    • S1S2S1S2tag S1S2

    • T

    • p=T

      • p

        • pS1 tag 0S2p=p->Lchild

      • p(1)tag

      • tag=0S1S2(tag1) S1p=S1[top]->Rchild (1)

      • tag=1S1


    5 4401880

    • #define MAX_NODE 50

    • void PostorderTraverse( BTNode *T)

      • { BTNode *S1[MAX_NODE] ,*p=T ;

        • int S2[MAX_NODE] , top=0 , bool=1 ;

        • if (T==NULL) printf(Binary Tree is Empty!\n) ;

        • else { do

          • { while (p!=NULL)

          • { S1[++top]=p ; S2[top]=0 ;

          • p=p->Lchild ;

          • }

          • if (top==0) bool=0 ;


    5 4401880

    • else if (S2[top]==0)

    • { p=S1[top]->Rchild ; S2[top]=1 ; }

    • else

    • { p=S1[top] ; top-- ;

    • visit( p->data ) ; p=NULL ;

    • /* */}

    • } while (bool!=0) ;

  • }

  • }


  • 5 3 4

    5.3.4

    T

    p=Tp

    p

    p

    p


    5 4401880

    • #define MAX_NODE 50

    • void LevelorderTraverse( BTNode *T)

      • { BTNode *Queue[MAX_NODE] ,*p=T ;

        • int front=0 , rear=0 ;

        • if (p!=NULL)

          • { Queue[++rear]=p; /* */

            • while (front<rear)

            • { p=Queue[++front]; visit( p->data );

            • if (p->Lchild!=NULL)

            • Queue[++rear]=p; /* */

            • if (p->Rchild!=NULL)

            • Queue[++rear]=p; /* */

            • }

          • }

      • }


    5 3 5

    5.3.5


    5 4401880

    i

    ch

    1

    ()

    ich

    S[n] iS[i]


    5 4401880

    • #define MAX_NODE 50

    • typedef struct BTNode

      • { char data ;

        • struct BTNode *Lchild , *Rchild ;

      • }BTNode ;

    • BTNode *Create_BTree(void)

    • /* */

      • { BTNode *T , *p , *s[MAX_NODE] ;

        • char ch ; int i , j ;

        • while (1)

          • { scanf(%d, &i) ;

            • if (i==0) break ; /* 0 */

            • else

            • { ch=getchar() ;


    5 4401880

    • p=(BTNode *)malloc(sizeof(BTNode)) ;

    • p>data=ch ;

    • p>Lchild=p>Rchild=NULL ; s[i]=p ;

    • if (i==1) T=p ;

    • else

    • { j=i/2 ; /* ji */

    • if (i%2==0) s[j]->Lchild=p ;

    • else s[j]->Rchild=p ;

    • }

    • }

  • }

  • return(T) ;

  • }


  • 5 4401880

    A

    A

    C

    C

    B

    B

    ?

    F

    D

    E

    F

    D

    E

    ?

    ?

    ?

    ?

    ?

    G

    G

    ?

    ?

    (a)T1

    (b)T1T2

    6-10T1T2

    T1T26-10


    5 4401880

    • ()

      • char

      • int0-1

      • NULL

      • ()


    5 4401880

    • #define NULLKY ?

    • #define MAX_NODE 50

    • typedef struct BTNode

      • { char data ;

        • struct BTNode *Lchild , *Rchild ;

      • }BTNode ;

    • BTNode *Preorder_Create_BTree(BTNode *T)

      • /* */

      • { char ch ;

        • ch=getchar() ; getchar();

        • if (ch==NULLKY)

          • { T=NULL; return(T) ; }


    5 4401880

    • else

      • { T=(BTNode *)malloc(sizeof(BTNode)) ;

        • T>data=ch ;

        • Preorder_Create_BTree(T->Lchild) ;

        • Preorder_Create_BTree(T->Rchild) ;

        • return(T) ;

      • }

  • }

  • 6-10(a)

    • ABD??E?G??CF???


  • 5 4401880

    2

    vist()

    #define MAX_NODE 50

    int search_leaves( BTNode *T)

    { BTNode *Stack[MAX_NODE] ,*p=T;

    int top=0, num=0;

    if (T!=NULL)


    5 4401880

    • { stack[++top]=p ;

      • while (top>0)

      • { p=stack[top--] ;

      • if (p->Lchild==NULL&&p->Rchild==NULL) num++ ;

      • if (p->Rchild!=NULL )

      • stack[++top]=p->Rchild;

      • if (p->Lchild!=NULL )

      • stack[++top]=p->Lchild;

      • }

      • }

  • return(num) ;

  • }


  • 5 4401880

    3

    #define MAX_NODE 50

    int search_depth( BTNode *T)

    { BTNode *Stack[MAX_NODE] ,*p=T;

    int front=0 , rear=0, depth=0, level ;

    /* level */

    if (T!=NULL)

    { Queue[++rear]=p; /* */

    level=rear ; /* 1 */


    5 4401880

    • while (front<rear)

    • { p=Queue[++front];

    • if (p->Lchild!=NULL)

    • Queue[++rear]=p; /* */

    • if (p->Rchild!=NULL)

    • Queue[++rear]=p; /* */

    • if (front==level)

    • /* */

    • { depth++ ; level=rear ; }

    • }

  • }

  • }


  • 5 4401880

    5.4

    ()??

    nn-1() n2n(LchildRchild) n+1


    5 4401880

    Lchild Ltag data Rchild Rtag

    6-10

    0Lchild

    0Rchild

    Ltag=

    Rtag=

    1Lchild

    1Rchild

    • Lchild

    • Rchild

  • ,6-10


  • 5 4401880

    • typedef struct BiThrNode

      • { ElemType data;

        • struct BiTreeNode *Lchild , *Rchild ;

        • int Ltag , Rtag ;

      • }BiThrNode ;

    • 6-11


    5 4401880

    A

    A

    A

    A

    C

    C

    C

    C

    B

    B

    B

    B

    NIL

    NIL

    NIL

    F

    F

    F

    F

    D

    D

    D

    D

    E

    E

    E

    E

    NIL

    H

    H

    H

    H

    I

    I

    I

    I

    G

    G

    G

    G

    (b)

    ABDCEGFHI

    (c)

    DBAGECHFI

    (d)

    DBGEHIFCA

    (a)


    5 4401880

    (e)

    6-11

    0 A 0

    0 B 1

    0 C 0

    1 D 1

    0 E 1

    0 F 0

    1 G 1

    1 H 1

    1 F 1


    5 4401880

    • ?6-11(d) (e)

      • GE

      • ()CFLtag=1CH


    5 4401880

    • ?Ltag=1()


    5 4 1

    5.4.1

    head

    Lchild

    Rchild

    LchildRchildhead


    5 4401880

    • 6-12

    • #define MAX_NODE 50

    • typedef enmu{Link , Thread} PointerTag ;

      • /* Link=0 Thread=1 */

    • typedef struct BiThrNode

      • { ElemType data;

        • struct BiTreeNode *Lchild , *Rchild ;

        • PointerTag Ltag , Rtag ;

      • }BiThrNode;


    5 4401880

    head

    (a)

    (b)

    A

    A

    Thrt

    0 1

    1 F 1

    0 C 0

    1 D 1

    0 E 1

    0 A 0

    0 F 0

    1 G 1

    1 H 1

    0 B 1

    C

    C

    B

    B

    NIL

    NIL

    F

    F

    D

    D

    E

    E

    H

    H

    I

    I

    G

    G

    (c)

    6-12


    5 4401880

    • 1

    • void preorder_Threading(BiThrNode *T)

      • { BiThrNode *stack[MAX_NODE];

        • BiThrNode*last=NULL, *p ;

        • int top=0 ;

        • if (T!=NULL)

          • { stack[++top]=T;

            • while (top>0)

            • { p=stack[top--] ;

            • if (p->Lchild!=NULL) p->Ltag=0 ;

            • else { p->Ltag=1 ; p->Lchild!=last ; }

            • if (last!=NULL)

            • if (last->Rchild!=NULL) last->Rtag=0 ;


    5 4401880

    • else

    • { last->Rtag=1 ; last->Rchild!=p ; }

    • last=p ;

    • if (p->Rchild!=NULL)

    • stack[++top]=p->Rchild;

    • if (p->Lchild!=NULL)

    • stack[++top]=p->Lchild;

    • }

    • Last->Rtag=1; /* */

  • }

  • }


  • 5 4401880

    • 2

    • void inorder_Threading(BiThrNode *T)

      • { BiThrNode *stack[MAX_NODE];

        • BiThrNode*last=NULL, *p=T ;

        • int top=0 ;

        • while (p!=NULL||top>0)

          • if (p!=NULL) { stack[++top]=p; p=p->Lchild; }

          • else

            • { p=stack[top--] ;

            • if (p->Lchild!=NULL) p->Ltag=0 ;

            • else { p->Ltag=1 ; p->Lchild!=last ; }

            • if (last!=NULL)

            • if (last->Rchild!=NULL) last->Rtag=0 ;


    5 4401880

    • else { last->Rtag=1 ; last->Rchild!=p ; }

    • last=p ;

    • P=p->Rchild;

    • }

  • last->Rtag=1; /* */

  • }

  • }


  • 5 4 2

    5.4.2


    5 4401880

    • 1

    • void preorder_Thread_bt(BiThrNode *T)

      • { BiThrNode *p=T ;

        • while (p!=NULL)

        • { visit(p->data);

        • if (p->Ltag==0) p=p->Lchild ;

        • else p=p->Rchild

          • }

      • }


    5 4401880

    • 2

    • void inorder_Thread_bt(BiThrNode *T)

      • { BiThrNode *p ;

        • if (T!=NULL)

          • { p=T;

            • while (p->Ltag==0)

            • p=p->Lchild; /* */

            • while (p!=NULL)

            • { visit(p->data);

            • if (p->Rtag==1)

            • p=p->Rchild ; /* */

            • else /* */

            • { p=p->Rchild ;


    5 4401880

    • while (p->Ltag==0 ) p=p->Lchild;

    • }

    • }

  • }

  • }


  • 5 4401880

    5.5


    5 5 1

    5.5.1

    1 ()

    ()()

    • #define MAX_SIZE 100

    • typedef struct PTNode

      • { ElemType data ;

        • int parent ;

      • }PTNode ;


    5 4401880

    R

    A

    B

    C

    9

    0

    2

    3

    4

    5

    6

    7

    8

    1

    I 6

    B 0

    E 1

    G 6

    F 3

    A 0

    C 0

    D 1

    R -1

    H 6

    D

    F

    E

    G

    H

    I

    6-13

    • typedef struct

      • { PTNode Nodes[MAX_SIZE] ;

        • int root; /* */

        • int num ; /* */

      • }Ptree ;

    • 6-13


    5 4401880

    2

    6-14(a) nkn(k-1)+1

    6-14(b)


    5 4401880

    6-14

    (a)

    data firstchild

    data child1 child2 childn

    data k child1 child2 childk

    childno next

    (a)

    (b)

    (b)

    6-15

    6-15

    nn()()n


    5 4401880

    #define MAX_NODE 100

    typedef struct listnode

    { int childno ; /* */

    struct listno *next ;

    }CTNode; /* */

    • typedef struct

      • { ElemType data ;

        • CTNode *firstchild ;

      • }HNode; /* */


    5 4401880

    • typedef struct

      • { HNode nodes[MAX_NODE] ;

        • int root; /* */

        • int num ; /* */

      • }CLinkList; /* */

    • 6-13T6-16


    5 4401880

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    G

    6

    7

    8

    9

    3

    5

    1

    2

    0

    F

    E

    I

    C

    B

    D

    R

    H

    A

    MAX_NODE-1

    root

    4

    num

    9

    6-16 6-13T

    nodes


    5 4401880

    3 ()

    6-17(a)

    • typedef struct CSnode

      • { ElemType data ;

        • struct CSnode *firstchild, *nextsibing ;

      • }CSNode;

    • 6-17(b)6-17(c)


    5 4401880

    R

    A

    B

    C

    (a)

    F

    G

    D

    E

    (b)

    C

    R

    A

    G

    B

    F

    E

    D

    firstchild data nextsibing

    (c)

    6-17


    5 5 2

    5.5.2

    6-18


    5 4401880

    R

    R

    A

    A

    C

    B

    B

    D

    D

    E

    C

    E

    D

    D

    R

    A

    R

    A

    B

    C

    C

    C

    B

    B

    E

    E

    E

    R

    A

    D

    6-18


    5 4401880

    1

    450

    6-19


    5 4401880

    R

    A

    B

    C

    F

    G

    D

    E

    R

    R

    A

    C

    A

    B

    B

    D

    F

    G

    E

    D

    C

    E

    G

    (a)

    F

    (b)

    (C)

    6-19


    5 4401880

    2

    ?

    iii6-20(a)

    6-20(b)

    6-20(c)


    5 4401880

    R

    A

    B

    C

    F

    G

    D

    E

    R

    R

    A

    A

    B

    D

    D

    B

    C

    E

    (C)

    C

    E

    G

    G

    F

    (a)

    (b)

    F

    6-20


    5 4401880

    3

    ()()

    F={T1, T2,,Tn}B=(rootLBRB)

    n=0B

    n>0BT1root(T1)BLBB(T11,T12, ,T1m) T11,T12, ,T1mT1()RBF={T2, T3,,Tn}


    5 4401880

    G

    A

    L

    K

    M

    A

    B

    C

    G

    G

    A

    H

    B

    D

    L

    L

    B

    C

    C

    K

    K

    H

    H

    D

    M

    M

    D

    (b)

    (a)

    (c)

    6-21

    F={T1, T2,,Tn}

    6-21


    5 4401880

    4

    B=(rootLBRB)F={T1, T2,,Tn}

    BF

    BFT1root(T1)root T1F1BLBFT1F={T2, T3,,Tn} BRB


    5 4401880

    A

    B

    C

    A

    A

    G

    M

    D

    B

    G

    B

    G

    L

    K

    C

    M

    L

    C

    M

    L

    H

    H

    D

    K

    H

    D

    K

    (c)

    (b)

    (a)

    6-22

    BF6-22(b)

    6- 22(c)


    5 5 3

    5.5.3

    1

    6-23

    ABCDEFGIJHK

    6-23

    CDBFGIJHEKA


    5 4401880

    A

    E

    K

    B

    F

    H

    G

    D

    C

    J

    I

    6-23


    5 4401880

    2

    F={T1, T2,,Tn}F

    F

    F


    5 4401880

    5.6

    (Huffman)


    6 6 1 huffman

    6.6.1 (Huffman)

    1

    6-23AF AEF () 231+52+23=19


    5 4401880

    ()

    ()

    WPL=w1l1+w2l2++wnln=wili (i=1,2,,n)

    nwiilii

    Huffmann(wi) WPLHuffman()


    5 4401880

    Huffman

    6-2423674

    (a) WPL=22+32+62+72=36

    (b) WPL=21+32+63+73=47

    (c) WPL=71+62+23+33=34

    (c) WPLHuffman


    5 4401880

    7

    2

    2

    6

    3

    3

    7

    6

    (a)

    3

    (c)

    2

    (b)

    6

    7

    6-24

    2 Huffman

    n{w1, w2, ,wn}nF={T1, T2, ,Tn}wi


    5 4401880

    F

    FF

    F

    HuffmanF={T1,T2, ,Tn}


    5 4401880

    7

    7

    10

    5

    5

    8

    6

    8

    6

    3

    4

    5

    5

    8

    6

    3

    4

    3

    4

    5

    5

    31

    8

    10

    13

    13

    13

    18

    18

    1

    0

    5

    5

    10

    10

    6

    6

    6

    7

    7

    7

    8

    8

    0

    1

    0

    1

    3

    3

    3

    4

    4

    4

    5

    5

    5

    5

    0

    0

    1

    1

    6-25 Huffman

    6-25W={8, 3, 4, 6, 5, 5}HuffmanHuffmanWPL

    WPL=62+33+43+82+53+53 =79


    5 6 2

    5.6.2

    1 Huffman

    01

    Huffman

    C={c1,c2, ,ci, ,cn}W={w1,w2, ,wi, ,wn}


    5 4401880

    Huffman

    CW HuffmanHuffman01

    01Huffman

    HuffmanHuffman


    5 4401880

    C={a, b, c, d, e, f}W={8, 3, 4, 6, 5, 5}6-25a,b, c,d, e,fHuffman1001001100 110111

    2 Huffman

    (1)

    Huffman1nHuffman2n-12n-16-26


    5 4401880

    Weight Parent Lchild Rchild

    Weight Parent

    Lchild, Rchild

    6-26 Huffman

    #define MAX_NODE 200 /* Max_Node>2n-1*/

    typedef struct

    { unsigned int Weight ; /* */

    unsinged int Parent , Lchild , Rchild ;

    } HTNode ;


    5 4401880

    • (2) Huffman

    • void Create_Huffman(unsigned n, HTNode HT[ ], unsigned m)

    • /* nHuffman */

      • { unsigned int w ; int k , j ;

        • for (k=1 ; k<m ; k++)

          • { if (k<=n)

            • { printf(\n Please Input Weight : w=?);

            • scanf(%d, &w) ;HT[k].weight=w ;

            • } /* */

            • else HT[k].weight=0; /* */


    5 4401880

    • HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0 ;

  • } /* HT */

  • for (k=n+1; k<m ; k++)

    • { unsigned w1=32767 , w2=w1 ;

      • /* w1 , w2 */

      • int p1=0 , p2=0 ;

      • /* p1 , p2 */

      • for (j=1 ; j<=k-1 ; j++)

      • { if (HT[k].Parent==0) /* */

      • { if (HT[j].Weight<w1)

      • { w2=w1 ; p2=p1 ;

      • w1=HT[j].Weight ; p1=j ;

      • }


  • 5 4401880

    • else if (HT[j].Weight<w2)

    • { w2=HT[j].Weight ; p2=j ; }

    • } /* */

    • }

  • HT[k].Lchild=p1 ; HT[k].Rchild=p2 ;

  • HT[k].weight=w1+w2 ;

  • HT[p1].Parent=k ; HT[p2].Parent=k ;

  • }

  • }

  • Huffman2n-1 m-1


  • 5 4401880

    • (3) Huffman

    • ()WeightHuffman

      • Huffman

      • Huffman

    • Huffmann2n-1HT1n

      • HT[1n]n

      • n


    5 4401880

    • void Huff_coding(unsigned n , Hnode HT[] , unsigned m)

    • /* mn+1,n1*/

      • { int k , sp ,fp ;

        • char *cd , *HC[m] ;

        • cd=(char *)malloc(m*sizeof(char)) ;

          • /* */

        • cd[n]=\0/* */

        • for (k=1 ; k<n+1 ; k++) /* */

          • { sp=n ; p=k ; fp=HT[k].parent ;


    5 4401880

    • for ( ; fp!=0 ;p=fp , fp=HT[p].parent)

    • /* */

    • if (HT[fp].parent==p) cd[--sp]=0 ;

    • else cd[--sp]=1 ;

    • HC[k]=(char *)malloc((n-sp)*sizeof(char)) ;

    • /*k */

    • trcpy(HC[k] , &cd[sp]) ;

  • }

  • free(cd) ;

  • }


  • 5 4401880

    xy(x,y) { (e,i), (b,e), (b,d), (a,b), (g,j), (c,g), (c,f), (h,l), (c,h), (a,c) }

    ? ? g? g? g? e? e? f?

    bn? ? c?


    5 4401880

    hk hk ()1

    ?

    i()?

    ij()?

    i? ?


    5 4401880

    a

    b

    c

    d

    e

    f

    g

    k

    h

    n

    m

    6-27

    6-27

    ABDGHCEFIGDHBAECIF

    BDCEAFHGDECBHGFA


    5 4401880

    dgbaekchifgdbkeihfca

    6-27FF

    6-28


    5 4401880

    6-28

    a

    b

    m

    c

    d

    e

    n

    k

    g

    f

    h

    w={3,5,7,8,11,12} whuffmanWPL

    {a, b, c, d, e, f, g, h} 8{0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10}

    huffman()

    huffman


    5 4401880

    (Graph)

    ()0()


    5 4401880


    5 4401880

    5.1

    5.1.1

    (G)(V,E) G=(V,E) V(Vertex)V(G)EV&VE(G) (Arc)

    G=(V E)

    V={v|vdata object}

    E={<v,w>| v,wVp(v,w)}

    P(v,w)vw


    5 4401880

    (Arc)vw<v,w>

    (Digraph) GE(G)<v,w>vwG

    <v,w>E(G) vw v(tail)(initialnode)w(head)(terminal node)

    (Undigraph) GE(G)<v,w>vwG


    5 4401880

    <v,w>E(G) <w,v>E(G) E(G)(v,w) vw(Edge)(v,w) (w,v)

    1G1G2

    G1=(V1 E1)

    V1={a,b,c,d,e}

    E1={<a,b>,<a,c>, <a,e>,<c,d>,<c,e> ,<d,a>,<d,b>,<e,d>}

    G2=(V2 E2)

    V2={a,b,c,d}

    E2={(a,b), (a,c), (a,d), (b,d), (b,c), (c,d)}

    7-1


    5 4401880

    (b) G2

    (a) G1

    7-1

    a

    b

    e

    d

    c

    a

    d

    c

    b

    n ee [0n(n-1)/2] n(n-1)/2

    G=(VE)vivjV vivj(vi ,vj)E


    5 4401880

    n ee[0n(n-1)] n(n-1)

    G=(VE)vivjV vi vj<vi ,vj>E<vj ,vi >E

    e<nn

    (Weight)


    5 4401880

    G=(VE)G=(VE)VVEE GGV=VEEGG

    (Adjacent)G=(VE)(v,w)Evw vw(v,w)(incident)vw

    G=(V E)<v,w>Evww v <v,w> vw

    G=(VE) viVGvivi(degree)TD(vi)


    5 4401880

    2 TD(vi)=2e i=1, 2, , n e

    G=(VE)vi V Gvi()vi(Outdegree)OD(vi) vi()vi(Indegree)ID(vi) viviTD(vi)

    TD(vi)=OD(vi)+ID(vi)

    (Path)(Cycle) G=(VE)vivjvivjvivj

    G=(VE)vivjvi()vj


    5 4401880

    G

    Path=vi0vi1vim vijV(vij-1, vij)E j=1,2, ,m

    Path=vi0vi1 vim vijV<vij-1, vij>E j=1,2, ,m

    ()

    ()()


    5 4401880

    G=(VE)vi vj VvivjGGG

    G=(VE)vi vj VvivjvjviGGG

    G


    5 4401880

    a

    d

    b

    c

    7-2 G2

    ()nn-17-2

    nn-1

    nn-1

    • n-1

    • n-1


    5 4401880

    6

    a

    b

    3

    d

    a

    c

    3

    e

    2

    4

    5

    a

    b

    1

    b

    b

    e

    c

    c

    d

    c

    e

    c

    d

    7-4

    (a)

    (b)

    7-3

    0 17-3

    ()()7-4


    5 1 21

    5.1.2

    • ADT Graph{

      • V

      • RR={VR}

        • VR={<v,w>|<v,w>| v,wVp(v,w) <v,w> vwP(v,w)<v,w> }


    5 4401880

    • P

      • Create_Graph()

      • GGetVex(G, v) v

        • Gv

        • G

      • DFStraver(G,V)vG

      • G

      • G


    5 4401880

    • BFStraver(G,V)vG

    • G

    • G

  • } ADT Graph

  • p156~157


  • 5 4401880

    5.2


    5 2 1

    5.2.1 ()

    nvexs[n]A[n][n]vexsA[i][j]ij


    5 4401880

    a

    d

    1 (vi , vj)Evi , vj

    A[i][j]=

    0 (vi , vj)Evi , vj

    c

    b

    vexs

    0 1 1 1

    a

    b

    1 0 1 1

    c

    1 1 0 1

    d

    1 1 1 0

    (c)

    (a)

    (b)

    7-5

    1

    (1)

    G=(VE)n(n1)n7-5


    5 4401880

    Wij (vi , vj)Evi , vjwij

    A[i][j]=

    (vi , vj)Evi , vj

    6 2

    6 3 4 3

    2 3 1

    vexs

    4 3 5

    6

    a

    b

    3

    a

    3 5

    3

    e

    2

    b

    4

    5

    c

    1

    d

    c

    d

    (a)

    e

    (b)

    (c)

    7-6

    (2)

    G=(VE) 7-6


    5 4401880

    1 <vi, vj>Evivj

    A[i][j]=

    0 <vi , vj>E vivj

    (3)

    vii0

    ()0

    • 2

    • (1)

    • G=(VE)n(n1)n7-7


    5 4401880

    a

    b

    e

    vexs

    d

    c

    0 1 1 0 1

    a

    b

    0 0 0 0 0

    c

    0 0 0 1 1

    d

    wij <vi,vj>Evi , vjwij

    1 1 0 0 0

    e

    0 0 0 1 0

    A[i][j]=

    (c)

    (a)

    (b)

    <vi,vj>Evi , vj

    7-7

    (2)

    G=(VE)7-8


    5 4401880

    (a)

    (b)

    (c)

    6

    a

    b

    3

    7-8

    3

    e

    2

    4

    5

    1

    d

    c

    vexs

    6 2

    a

    3

    b

    3 1

    c

    4 5

    d

    e

    vii0OD(vi)i0ID(vi)

    0


    5 4401880

    3

    ()()

    #define INFINITY MAX_VAL /* */

    /* */

    #define MAX_VEX 30 /* */

    typedef enum {DG, AG, WDG,WAG} GraphKind ;

    /* {} */


    5 4401880

    • typedef struct ArcType

      • { VexType vex1, vex2 ; /* */

        • ArcValType ArcVal ; /* */

        • ArcInfoType ArcInfo ; /* */

      • }ArcType ; /* */

    • typedef struct

      • { GraphKind kind ; /* */

        • int vexnum , arcnum ; /* */

        • VexType vexs[MAX_VEX] ; /* */

        • AdjType adj[MAX_VEX][MAX_VEX];

        • }MGraph ; /* */


    5 4401880

    (1)

    AdjGraph *Create_Graph(MGraph * G)

    { printf() ;

    scanf(%d, &G->kind) ;

    G->vexnum=0 ; /* */

    return(G) ;

    }


    5 4401880

    (2)

    vexs()

    int LocateVex(MGraph *G , VexType *vp)

    { int k ;

    for (k=0 ; k<G->vexnum ; k++)

    if (G->vexs[k]==*vp) return(k) ;

    return(-1) ; /* */

    }


    5 4401880

    (3)

    • int AddVertex(MGraph *G , VexType *vp)

      • { int k , j ;

        • if (G->vexnum>=MAX_VEX)

          • { printf(Vertex Overflow !\n) ; return(-1) ; }

        • if (LocateVex(G , vp)!=-1)

          • { printf(Vertex has existed !\n) ; return(-1) ; }

        • k=G->vexnum ; G->vexs[G->vexnum++]=*vp ;


    5 4401880

    if (G->kind==DG||G->kind==AG)

    for (j=0 ; j<G->vexnum ; j++)

    G->adj[j][k].ArcVal=G->adj[k][j].ArcVal=0 ;

    /* */

    else

    for (j=0 ; j<G->vexnum ; j++)

    { G->adj[j][k].ArcVal=INFINITY ;

    G->adj[k][j].ArcVal=INFINITY ;

    /* */

    }

    return(k) ;

    }


    5 4401880

    (4)

    int AddArc(MGraph *G , ArcType *arc)

    { int k , j ;

    k=LocateVex(G , &arc->vex1) ;

    j=LocateVex(G , &arc->vex1) ;

    if (k==-1||j==-1)

    { printf(Arcs Vertex do not existed !\n) ;

    return(-1) ;

    }


    5 4401880

    if (G->kind==DG||G->kind==WDG)

    { G->adj[k][j].ArcVal=arc->ArcVal;

    G->adj[k][j].ArcInfo=arc->ArcInfo ;

    /* */

    }

    else

    { G->adj[k][j].ArcVal=arc->ArcVal ;

    G->adj[j][k].ArcVal=arc->ArcVal ;

    G->adj[k][j].ArcInfo=arc->ArcInfo ;

    G->adj[j][k].ArcInfo=arc->ArcInfo ;

    /* , */

    }

    return(1) ;

    }


    5 2 21

    5.2.2

    iVi(Vi)


    5 4401880

    7-9

    data firstarc

    adjvex info nextarc

    1

    7-9(a)(adjvex)Vi()(nextarc)Vi(info)

    ()7-9(b)(firstarc)(data)


    5 4401880

    3

    4

    0

    2

    4

    1

    3

    0

    2

    0

    3

    1

    2

    2

    0

    1

    2

    3

    4

    v5

    v4

    v3

    v2

    v1

    v4

    v1

    v5

    v3

    v2

    MAX_VEX-1

    7-10

    7-107-11


    5 4401880

    0

    1

    2

    3

    4

    4

    0

    2

    2

    1

    1

    3

    4

    2

    3

    0

    3

    0

    2

    v1 1

    v1 2

    v2 0

    v2 2

    v3 3

    v3 1

    v4 1

    v4 2

    v5 1

    v5 1

    MAX_VEX-1

    0

    1

    2

    3

    4

    (b)

    v4

    v1

    v5

    v3

    v2

    MAX_VEX-1

    (a)

    (c)

    7-11


    5 4401880

    2

    Vii

    Vi()Vi()

    iVi () ()


    5 4401880

    3

    #define MAX_VEX 30 /* */

    typedef int InfoType;

    typedef enum {DG, AG, WDG,WAG} GraphKind ;

    typedef struct LinkNode

    { int adjvex ; // ()

    InfoType info ; // ,

    struct LinkNode *nextarc ; //

    }LinkNode ; /* */


    5 4401880

    typedef struct VexNode

    { VexType data; //

    int indegree ; // ,

    LinkNode *firstarc ; //

    }VexNode ; /* */

    typedef struct ArcType

    { VexType vex1, vex2 ; /* */

    InfoType info ; // ,

    }ArcType ; /* */


    5 4401880

    typedef struct

    { GraphKind kind ; /* */

    int vexnum ;

    VexNode AdjList[MAX_VEX] ;

    }ALGraph ; /* */


    5 4401880

    (1)

    ALGraph *Create_Graph(ALGraph * G)

    { printf() ;

    scanf(%d, &G->kind) ;

    G->vexnum=0 ; /* */

    return(G) ;

    }


    5 4401880

    (2)

    AdjListdata

    int LocateVex(ALGraph *G , VexType *vp)

    { int k ;

    for (k=0 ; k<G->vexnum ; k++)

    if (G->AdjList[k].data==*vp) return(k) ;

    return(-1) ; /* */

    }


    5 4401880

    • (3)

    • AdjList

    • int AddVertex(ALGraph *G , VexType *vp)

      { int k , j ;

      if (G->vexnum>=MAX_VEX)

      { printf(Vertex Overflow !\n) ; return(-1) ; }

      if (LocateVex(G , vp)!=-1)

      { printf(Vertex has existed !\n) ; return(-1) ; }

      G->AdjList[G->vexnum].data=*vp ;


    5 4401880

    G->AdjList[G->vexnum].degree=0 ;

    G->AdjList[G->vexnum].firstarc=NULL ;

    k=++G->vexnum ;

    return(k) ;

    }

    • (4)

    • int AddArc(ALGraph *G , ArcType *arc)

      • { int k , j ;

        • LinkNode *p ,*q ;


    5 4401880

    k=LocateVex(G , &arc->vex1) ;

    j=LocateVex(G , &arc->vex2) ;

    • if (k==-1||j==-1)

      • { printf(Arcs Vertex do not existed !\n) ;

        • return(-1) ;

      • }

    • p=(LinkNode *)malloc(sizeof(LinkNode)) ;

    • p->adjvex=arc->vex1 ; p->info=arc->info ;

    • p->nextarc=NULL ; /* */

    • q=(LinkNode *)malloc(sizeof(LinkNode)) ;

    • q->adjvex=arc->vex2 ; q->info=arc->info ;

    • q->nextarc=NULL ; /* */


    5 4401880

    if (G->kind==AG||G->kind==WAG)

    { q->nextarc=G->adjlist[k].firstarc ;

    G->adjlist[k].firstarc=q ;

    p->nextarc=G->adjlist[j].firstarc ;

    G->adjlist[j].firstarc=p ;

    } /* , */

    else /* , */

    { q->nextarc=G->adjlist[k].firstarc ;

    G->adjlist[k].firstarc=q ; /* */

    //q->nextarc=G->adjlist[j].firstarc ;

    //G->adjlist[j].firstarc=q ; /* */

    }

    return(1);

    }


    5 2 31

    tailvex headvex info hlink tlink

    Data firstin firstout

    7-12

    5.2.3

    (Orthogonal List)

    ()()7-12


    5 4401880

    data

    firstin

    • firstout

    • tailvex

    • headvex

    • hlink

    • tlink

    • Info


    5 4401880

    #define INFINITY MAX_VAL /* */

    #define MAX_VEX 30 //

    typedef struct ArcNode

    { int tailvex , headvex ; //

    InfoType info ; // ,

    struct ArcNode *hlink , *tlink ;

    }ArcNode ; /* */

    typedef struct VexNode

    { VexType data; //

    ArcNode *firstin , *firstout ;

    }VexNode ; /* */


    5 4401880

    typedef struct

    { int vexnum ;

    VexNode xlist[MAX_VEX] ;

    }OLGraph ; /* */

    7-13(info)

    firstouttlinkfirstinhlink


    5 4401880

    V0

    V1

    V3

    V2

    V2

    V1

    V0

    V3

    3 0

    0 1

    0 2

    3 1

    2 3

    3 2

    2 0

    0

    1

    2

    3

    7-13


    5 2 4

    data firstedge

    mark ivex jvex info ilink jlink

    7-14

    5.2.4

    (Adjacency Multilist)

    (v,w)vw

    7-14


    5 4401880

    Data

    firstedge

    mark

    ivexjvex

    info

    ilinkivex

    jlinkjvex


    5 4401880

    #define INFINITY MAX_VAL /* */

    #define MAX_VEX 30 /* */

    typedef emnu {unvisited , visited} Visitting ;

    typedef struct EdgeNode

    { Visitting mark ; //

    int ivex , jvex ; //

    InfoType info ; // ,

    struct EdgeNode *ilink , *jlink ;

    //

    }EdgeNode ; /* */


    5 4401880

    typedef struct VexNode

    { VexType data; //

    ArcNode *firsedge ; //

    }VexNode ; /* */

    typedef struct

    { int vexnum ;

    VexNode mullist[MAX_VEX] ;

    }AMGraph ;

    7-15


    5 4401880

    0

    0 3

    2 1

    0 2

    0 1

    2 3

    1

    v4

    v1

    2

    v4

    v2

    v1

    v3

    3

    v3

    v2

    7-15


    5 2 5

    5.2.5

    7-16

    #define INFINITY MAX_VAL /* */

    #define MAX_VEX 30 /* */

    #define MAX_EDGE 100 /* */


    5 4401880

    typedef struct ENode

    { int ivex , jvex ; /* */

    WeightType weight ; /* */

    }ENode ; /* */

    typedef struct

    { int vexnum , edgenum ; /* */

    VexType vexlist[MAX_VEX] ; /* */

    ENode edgelist[MAX_EDGE] ; /* */

    }ELGraph ;


    5 4401880

    0 1 6

    0 2 7

    0

    v0

    v0

    7

    1 3 2

    1

    v1

    6

    1 4 9

    2

    v2

    v2

    v1

    9

    8

    2 3 8

    3

    v3

    3

    2

    2 4 3

    v4

    4

    4

    v3

    v4

    7-16

    3 4 4


    5 4401880

    5.3

    (Travering Graph)

    Visited[1n](n)0viVisited[i]1

    ()


    5 3 11

    5.3.1

    (Depth First Search--DFS)

    1

    vivivivi1

    vi1vi1

    vi


    5 4401880

    v1

    v3

    1

    4

    0

    0

    2

    3

    1

    2

    v4

    v5

    v2

    0

    1

    2

    3

    4

    (a) G

    v1

    v4

    v2

    v5

    v3

    MAX_VEX-1

    7-17

    (b) G

    vj(1)

    7-17()DFSv1v3 v2 v4 v5


    5 4401880

    2

    ()v0

    typedef emnu {FALSE , TRUE} BOOLEAN ;

    BOOLEAN Visited[MAX_VEX] ;


    5 4401880

    void DFS(ALGraph *G , int v)

    { LinkNode *p ;

    Visited[v]=TRUE ;

    Visit[v] ; /* v */

    p=G->AdjList[v].firstarc; /* */

    while (p!=NULL)

    { if (!Visited[p->adjvex]) DFS(G, p->adjvex) ;

    /* v */

    p=p->nextarc ;

    }

    }


    5 4401880

    void DFS_traverse_Grapg(ALGraph *G)

    { int v ;

    for (v=0 ; v<G->vexnum ; v++)

    Visited[v]=FALSE ; /* */

    p=G->AdjList[v].firstarc ;

    for (v=0 ; v<G->vexnum ; v++)

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

    }

    • 3

    • DFSeO(e)O(n+e)


    5 3 21

    5.3.2

    (Breadth First Search--BFS)

    1

    vivi

    vivi1vi2vim

    vi1vi2 vimvij(1jm)vi


    5 4401880

    1

    3

    0

    1

    4

    2

    3

    v1 2

    v2 0

    v3 3

    v4 1

    0

    1

    2

    3

    4

    v5 1

    v4

    v1

    v5

    v3

    v2

    (a) G

    MAX_VEX-1

    (b) G

    7-18

    vk

    7-18()BFSv1v2 v4 v3 v5


    5 4401880

    2

    vivi

    typedef emnu {FALSE , TRUE} BOOLEAN ;

    BOOLEAN Visited[MAX_VEX] ;

    typedef struct Queue

    { int elem[MAX_VEX] ;

    int front , rear ;

    }Queue ; /* */


    5 4401880

    void BFS_traverse_Grapg(ALGraph *G)

    { int k ,v , w ;

    LinkNode *p ; Queue *Q ;

    Q=(Queue *)malloc(sizeof(Queue)) ;

    Q->front=Q->rear=0 ; /* */

    for (k=0 ; k<G->vexnum ; k++)

    Visited[k]=FALSE ; /* */

    for (k=0 ; k<G->vexnum ; k++)

    { v=G->AdjList[k].data ; /* */

    if (!Visited[v]) /* v */

    { Q->elem[++Q->rear]=v ; /* v */

    while (Q->front!=Q->rear)


    5 4401880

    { w=Q->elem[++Q->front] ;

    Visited[w]=TRUE ; /* */

    Visit(w) ; /* */

    p=G->AdjList[w].firstarc ;

    while (p!=NULL)

    { if (!Visited[p->adjvex])

    Q->elem[++Q->rear]=p->adjvex ;

    p=p->nextarc ;

    }

    } /* end while */

    } /* end if */

    } /* end for */

    • }


    5 4401880

    O(n+e)


    5 4401880

    5.4

    5.4.1

    1


    5 4401880

    v1

    v3

    0

    1

    2

    3

    4

    v4

    v1

    v3

    2

    2

    1

    1

    4

    3

    0

    0

    v4

    v5

    v2

    v2

    v5

    (c)

    (a) G

    MAX_VEX-1

    (b) G

    7-19

    v4

    v3

    v2

    v1

    v5

    7-192DFS { v1 ,v3 ,v2}{ v4 ,v5 }


    5 4401880

    G=(V,E) V(G) E(G) G E(G)

    T(G)

    B(G)

    E(G)=T(G)B(G) T(G)B(G)=

    G=(V, T(G))GGGG

    DFSGBFSG


    5 4401880

    G=(V,E)V1(G) ,V2(G) ,,Vn(G)T1(G) ,T2(G) , ,Tn(G)

    Gi=(Vi(G),Ti(G))

    (1in)


    5 4401880

    2

    DFS(BFS)DFS

    VVV V


    5 4401880

    (1) DFStree

    • typedef struct CSNode

      • { ElemType data ;

        • struct CSNode *firstchild , *nextsibling ;

      • }CSNode ;

    • CSNode *DFStree(ALGraph *G , int v)

      • { CSNode *T , *ptr , *q ;

        • LinkNode *p ; int w ;

        • Visited[v]=TRUE ;

        • T=(CSNode *)malloc(sizeof(CSNode)) ;

        • T->data=G->AdjList[v].data ;

        • T->firstchild=T->nextsibling=NULL ; //


    5 4401880

    • q=NULL ; p=G->AdjList[v].firstarc ;

    • while (p!=NULL)

      • { w=p->adjvex ;

        • if (!Visited[w])

        • { ptr=DFStree(G,w) ; /* */

        • if (q==NULL) T->firstchild=ptr ;

        • else q->nextsibling=ptr ;

        • q=ptr ;

        • }

      • p=p->nextarc ;

      • }

    • return(T) ;

  • }


  • 5 4401880

    (2) BFStree

    typedef struct Queue

    { int elem[MAX_VEX] ;

    int front , rear ;

    }Queue ; /* */

    • CSNode *BFStree(ALGraph *G ,int v)

    • { CSNode *T , *ptr , *q ;

      • LinkNode *p ; Queue *Q ;

      • int w , k ;

      • Q=(Queue *)malloc(sizeof(Queue)) ;

      • Q->front=Q->rear=0 ; /**/

      • Visited[v]=TRUE ;


    5 4401880

    T=(CSNode *)malloc(sizeof(CSNode)) ;

    T->data=G->AdjList[v].data ;

    T->firstchild=T->nextsibling=NULL ; //

    Q->elem[++Q->rear]=v ; /* v */

    while (Q->front!=Q->rear)

    { w=Q->elem[++Q->front] ; q=NULL ;

    p=G->AdjList[w].firstarc ;

    while (p!=NULL)

    { k=p->adjvex ;

    if (!Visited[k])

    { Visited[k]=TRUE ;


    5 4401880

    ptr=(CSNode *)malloc(sizeof(CSNode)) ;

    ptr->data=G->AdjList[k].data ;

    ptr->firstchild=T->nextsibling=NULL ;

    if (q==NULL) T->firstchild=ptr ;

    else q->nextsibling=ptr ;

    q=ptr ;

    Q->elem[++Q->rear]=k ; /* k */

    } /* end if */

    p=p->nextarc ;

    } /* end while p */

    } /* end whil Q */

    return(T) ;

    • } /*GBFStree*/


    5 4401880

    • (3)

    • CSNode *DFSForest(ALGraph *G)

      { CSNode *T , *ptr , *q ; int w ;

      for (w=0; w<G->vexnum; w++) Visited[w]=FALSE;

      T=NULL ;

      for (w=0 ; w<G->vexnum ; w++)

      if (!Visited[w])

      { ptr=DFStree(G, w) ;

      if (T==NULL) T=ptr ;

      else q->nextsibling=ptr ;

      q=ptr ; }

      return(T) ;

      }


    5 4 21

    5.4.2

    VGVV

    V (V)T1(G)V (V)T2(G)VT1(G)T2(G)

    G

    GGT

    T


    5 4401880

    GG

    • GGG

    • G

  • 7-20(a)


  • 5 4401880

    a

    a

    a

    6

    a

    b

    c

    b

    c

    c

    d

    b

    3

    5

    b

    d

    d

    e

    f

    2

    e

    f

    d

    4

    e

    f

    c

    f

    e

    1

    (a) G

    7-20

    (c) (3)

    (d) (4)(5)

    (b) (1)(2)

    in_order[n]vDFSin_order[n]

    int in_order[MAX_VEX] ;


    5 4401880

    void DFS(OLGraph *G , int v) //

    { ArcNode *p ;

    Count=0 ;

    Visited[v]=TRUE ;

    for (p=G->xlist[v].firstout ; p!=NULL ; p=p->tlink)

    if (!Visited[p->headvex])

    DFS(G , p->headvex) ;

    in_order[count++]=v ;

    }


    5 4401880

    void Rev_DFS(OLGraph *G , int v)

    { ArcNode *p ;

    Visited[v]=TRUE ;

    printf(%d , v) ; /* */

    for (p=G->xlist[v].firstin ; p!=NULL ; p=p->hlink)

    if (!Visited[p->tailvex])

    Rev_DFS(G , p->tailvex) ;

    } /* G */

    • void Connected_DG(OLGraph *G)

      • { int k=1, v, j ;

        • for (v=0; v<G->vexnum; v++)

          • Visited[v]=FALSE ;


    5 4401880

    for (v=0; v<G->vexnum; v++) /* G */

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

    for (v=0; v<G->vexnum; v++)

    Visited[v]=FALSE ;

    for (j=G->vexnum-1; j>=0; j--) /* G */

    { v=in_order[j] ;

    if (!Visited[v])

    { printf(\n%d: , k++) ;

    Rev_DFS(G, v) ;

    }

    }

    }


    5 4401880

    5.5

    (Minimum Spanning Tree)

    nn(n-1)/2n-1?


    5 4401880

    n-1

    • MST

    • G=(VE)UVuU vV-U(u, v)UV-U(u, v)


    5 4401880

    G(u,v)TGTuv(u,,v)(u,v)T(u, ,v)(u,v) uU vV-U (u,v) T

    (u,v)UV-U(u,v)(u,v)TT T(u,v)


    5 5 1 prim

    5.5.1 (Prim)

    N=(UE)T=(UTE)

    1

    v0U={v0}TE={}

    (uv)uUvV-UU= U{v}TE=TE{(uv)}

    U=VTEn-1T=(UTE)

    7-21


    5 4401880

    v2

    v2

    v2

    v2

    v2

    8

    7

    v3

    v3

    v1

    12

    5

    5

    5

    5

    5

    v1

    v1

    6

    6

    11

    4

    4

    4

    v4

    v4

    v4

    v4

    v4

    3

    3

    3

    3

    v5

    v5

    v5

    v5

    7-21 primev2

    (d)

    (e)

    (a)

    (b)

    (c)


    5 4401880

    2

    ()

    closedge[n]V- UU

    struct

    { int adjvex ; /* U */

    int lowcost ; /* */

    }closedge[MAX_EDGE] ;


    5 4401880

    Closedge[s].lowcost=0vsU

    Closedge[k].adjvex=sClosedge[k].lowcost=cost(k, s)

    closedge[j].adjvex=k(vj, vk)V-UvjUvkU closedge[j].lowcost

    vs

    V-UU(ks) cost(k, s)(vk, vs)


    5 4401880

    Closedge[i].lowcost=cost(i, k)

    Closedge[i].adjvex=k

    3

    closedge(0)(vk, vj)

    closedge[k].lowcost0 vkU

    vkclosedge

    viV-U cost(i, k)colsedge[i].lowcostUvk (vi, vk)viU

    n-1

    7-1


    5 4401880

    Primen-1

    typedef struct MSTEdge

    { int vex1, vex2 ; /* */

    WeightType weight ; /* */

    }MSTEdge ;

    #define INFINITY MAX_VAL /* */

    MSTEdge *Prim_MST(AdjGraph *G , int u)

    /* uG */

    { MSTEdge TE[] ; // n-1


    5 4401880

    int j , k , v , min ;

    for (j=0; j<G->vexnum; j++)

    { closedge[j].adjvex=u ;

    closedge[j].lowcost=G->adj[j][u] ;

    } /* closedge[n] */

    closedge[u].lowcost=0 ; /* U={u} */

    TE=(MSTEdge *)malloc((G->vexnum-1)*sizeof(MSTEdge)) ;

    for (j=0; j<G->vexnum-1; j++)

    { min= INFINITY ;

    for (v=0; v<G->vexnum; v++)

    if (closedge[v].lowcost!=0&& closedge[v].Lowcost<min)


    5 4401880

    { min=closedge[v].lowcost ; k=v ; }

    TE[j].vex1=closedge[k].adjvex ;

    TE[j].vex2=k ;

    TE[j].weight=closedge[k].lowcost ;

    closedge[k].lowcost=0 ; /* kU */

    for (v=0; v<G->vexnum; v++)

    if (G->adj[v][k]<closedge[v]. lowcost)

    { closedge[v].lowcost= G->adj[v][k] ;

    closedge[v].adjvex=k ;

    } /* closedge[n] */

    }

    return(TE) ;

    • } /* Prime */


    5 4401880

    7-1 closedge


    5 4401880

    n closedgen-1 closedgen O(n2)


    5 5 2 kruskal

    5.5.2 (Kruskal)

    1

    G=(V, E)nT=(U, TE)U=VTE={}

    G

    (vivj)(vivj)TE((vivj) TETE=TE{(vivj)}

    TEn-1

    7-22


    5 4401880

    v1

    v1

    v5

    v5

    v5

    v4

    v4

    v4

    (c)

    (b)

    v2

    v2

    v2

    8

    7

    v3

    v3

    v1

    12

    5

    5

    5

    v1

    (d)

    6

    6

    11

    4

    4

    4

    4

    7-22 kruskal

    v4

    v4

    3

    3

    3

    3

    3

    v5

    v5

    (e)

    (a)


    5 4401880

    2

    KruskalTE?

    Vset[n] T

    Vset[i]=i()

    T(vivj) Vset[i]Vset[j]

    Vset[i]=Vset[j]vivj


    5 4401880

    Vset[i]Vset[j]

    MSTEdge *Kruskal_MST(ELGraph *G)

    /* KruskalG */

    { MSTEdge TE[] ;

    int j, k, v, s1, s2, Vset[] ;

    WeightType w ;

    Vset=(int *)malloc(G->vexnum*sizeof(int)) ;


    5 4401880

    for (j=0; j<G->vexnum; j++)

    Vset[j]=j ; /* Vset[n] */

    sort(G->edgelist) ; /* */

    j=0 ; k=0 ;

    while (k<G->vexnum-1&&j< G->edgenum)

    { s1=Vset[G->edgelist[j].vex1] ;

    s2=Vset[G->edgelist[j].vex2] ;

    • /* , TE */

      • if (s1!=s2)

      • { TE[k].vex1=G->edgelist[j].vex1 ;

      • TE[k].vex2=G->edgelist[j].vex2 ;

      • TE[k].weight=G->edgelist[j].weight ;


    5 4401880

    k++ ;

    for (v=0; v<G->vexnum; v++)

    if (Vset[v]==s2) Vset[v]=s1 ;

    }

    j++ ;

    }

    free(Vset) ;

    return(TE) ;

    } /* Kruskal */


    5 4401880

    ne

    VsetO(n)

    O(ee)

    whileO(n)Vsetn-1O(n2)

    O(ee+n2)


    5 4401880

    5.6

    (Directed Acycling Graph)()

    (project)(active)()()

    ??

    ?


    5 4401880

    (Activity On Vertex NetworkAOV)


    5 6 1

    5.6.1

    1

    (Topological Sort)

    AAA(AA)

    aA(aa)RAR

    abA (ab)R(ba)RAR


    5 4401880

    abA (ab)R(ba)RARabA a=b(ab)R(ba)RAR

    abcA(ab)R(bc)R(ac)R AR

    ARRA

    RAabAaRbbRa RA


    5 4401880

    AOV<i, j>ijjiijijji

    AOV

    AOV(v1,v2, ,vn)()


    5 4401880

    7-23(v1,v6,v4,v3,v2,v5)

    2

    AOV

    AOV()()

    ()()


    5 4401880

    v2

    v2

    v2

    v2

    v5

    v2

    v1

    (b) v1

    (c) v6

    (d) v4

    (e) v3

    (a)

    v3

    v3

    v3

    v4

    v4

    7-23

    v3

    v4

    v6

    v5

    v5

    v5

    v6

    v5

    3

    AOV

    0

    1


    5 4401880

    (1)

    void count_indegree(ALGraph *G)

    { int k ; LinkNode *p ;

    for (k=0; k<G->vexnum; k++)

    G->adjlist[k].indegree=0 ; /* */

    for (k=0; k<G->vexnum; k++)

    { p=G->adjlist[k].firstarc ;

    while (p!=NULL) /* */

    { G->adjlist[p->adjvex].indegree++ ;

    p=p->nextarc ;

    }

    }

    }


    5 4401880

    (2)

    int Topologic_Sort(ALGraph *G, int topol[])

    /* topol */

    { int k, no, vex_no, top=0, count=0, boolean=1 ;

    int stack[MAX_VEX] ; /* */

    LinkNode *p ;

    count_indegree(G) ; /* */

    for (k=0; k<G->vexnum; k++)

    if (G->adjlist[k].indegree==0)

    stack[++top]=G->adjlist[k].data ;

    do

    { if (top==0) boolean=0 ;


    5 4401880

    else

    { no=stack[top--] ; /* */

    topl[++count]=no ; /* */

    p=G->adjlist[no].firstarc ;

    while (p!=NULL) /**/

    { vex_no=p->adjvex ;

    G->adjlist[vex_no].indegree-- ;

    if (G->adjlist[vex_no].indegree==0)

    stack[++top]=vex_no ;

    p=p->nextarc ;

    }

    }

    }while(boolean==0) ;


    5 4401880

    if (count<G->vexnum) return(-1) ;

    else return(1) ;

    }

    • AOVne

      • O(n+e)

      • 0O(n)

      • n1eO(n+e)

    • O(n+e)


    5 6 2 critical path

    a9=6

    a7=8

    a3=9

    v3

    v6

    v1

    a11=2

    a8=4

    a1=3

    a12=5

    v4

    v7

    v8

    v0

    a2=10

    a4=13

    a5=12

    a10=11

    v2

    v5

    a6=7

    7-24 AOE

    5.6.2 (Critical Path)

    AOVAOE(Activity On Edge) 7-24(Event)


    5 4401880

    1AOE

    ?

    ()?

    ()

    v0v0vivivi

    ai<j, k>dut(<j, k>)

    e(i)ai


    5 4401880

    e(i)=ve(j)

    7-1

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

    0 j=0vj

    ve(j)=

    7-2

    Max{ve(i)+dut(<i, j>)|<vi, vj>}

    l(i)ai l(i)-e(i)ail(i)-e(i)=0ai

    ve(i)vivi

    vl(i)vi


    5 4401880

    ve(n-1) j=n-1vj

    vl(j)=

    7-3

    Min{vl(k)-dut(<j, k>)|<vj, vk>}

    0vjvjvjvive(i)ve(j)

    vjvkvl(k)vl(j)


    5 4401880

    2AOE

    AOE

    ()ve(i)

    ()vl(i)

    7-24AOE

    (v0, v1, v2, v3 ,v4, v5 , v6 , v7 , v8)


    5 4401880

    ve(i)(7-2)vl(i)(7-3) ve(i)vl(i)7-2

    AOE (v0, v2, v4, v7 , v8) (v0, v2, v5 , v7 , v8)

    <v0, v2><v2, v4><v2, v5><v4, v7><v5, v7><v5, v8>

    7-2 7-24ve(i)vl(i)


    5 4401880

    void critical_path(ALGraph *G)

    { int j, k, m ; LinkNode *p ;

    if (Topologic_Sort(G)==-1)

    printf(\nAOE!!\n\n) ;

    else

    { for ( j=0; j<G->vexnum; j++)

    ve[j]=0 ; /* */

    for (m=0 ; m<G->vexnum; m++)

    { j=topol[m] ;

    p=G->adjlist[j].firstarc ;

    for (; p!=NULL; p=p->nextarc )


    5 4401880

    { k=p->adjvex ;

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

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

    }

    } /* ve */

    for ( j=0; j<G->vexnum; j++)

    vl[j]=ve[j] ; /* */

    • for (m=G->vexnum-1; m>=0; m--)

    • { j=topol[m] ; p=G->adjlist[j].firstarc ;

    • for (; p!=NULL; p=p->nextarc )

    • { k=p->adjvex ;

    • if (vl[k]-p->weight<vl[j])

    • vl[j]=vl[k]-p->weight ;


    5 4401880

    }

    } /* vl */

    for (m=0 ; m<G->vexnum; m++)

    { p=G->adjlist[m].firstarc ;

    for (; p!=NULL; p=p->nextarc )

    { k=p->adjvex ;

    if ( (ve[m]+p->weight)==vl[k])

    printf(<%d, %d>, m, j) ;

    }

    } /* */

    } /* end of else */

    • }


    5 4401880

    AOEne

    O(n+e)

    vevlO(n+e)

    vevlO(n+e)

    O(n+e)


    5 4401880

    5.7

    ()

    ?

    ?


    7 7 1

    7.7.1

    G=(VE)VsVsG

    Dijkstra(Dijkstra)

    1


    5 4401880

    2

    VsSS={Vs} (Vs Vi)S{VsVi}

    Vj Vj

    <VsVj>

    Vs Vj SSSVj


    5 4401880

    0 i =s

    dist[i]=

    Wsi is<vs,vi>E wsi

    is<vs,vi>E

    dist[n]dist[i]Vs SViVjS

    dist[i]=Min{ dist[k]| VkV-S }

    3

    S={Vs} Vi


    5 4401880

    Vj

    dist[j]=Min{ dist[k]| VkV-S }

    VjVj SS=S{Vj}

    V-SVk dist[k]

    dist[j]+Wjk<dist[k]

    dist[k]=dist[j]+Wjk (VkV-S )

    S=V


    5 4401880

    4

    PrimDijkstraPrimVklowcostdist[k]

    pre[n]Vspre[i]=kVs ViViVk(Vs , , Vk , Vi)

    final[n]S


    5 4401880

    BOOLEAN final[MAX_VEX] ;

    int pre[MAX_VEX] , dist[MAX_VEX] ;

    void Dijkstra_path (AdjGraph *G, int v)

    /* Gv */

    { int j, k, m, min ;

    for ( j=0; j<G->vexnum; j++)

    { pre[j]=v ; final[j]=FALSE ;

    dist[j]=G->adj[v][j] ;

    } /* */

    dist[v]=0 ; final[v]=TRUE ; /* S={v} */

    for ( j=0; j<G->vexnum-1; j++) /* n-1 */

    { m=0 ;


    5 4401880

    while (final[m]) m++; /* Svk */

    min=INFINITY ;

    for ( k=0; k<G->vexnum; k++)

    { if (!final[k]&&dist[m]<min)

    { min=dist[k] ; m=k ; }

    } /* dist[k] */

    final[m]=TRUE ; /* kS */

    for ( j=0; j<G->vexnum; j++)

    { if (!final[j]&&(dist[m]+G->adj[m][j]<dist[j]))

    { dist[j]=dist[m]+G->adj[m][j] ;

    pre[j]=m ;

    }

    } /* distpre */


    5 4401880

    } /* */

    }

    • 5

    • Dijkstra

      • O(n)

      • O(n2)

    • O(n2)

    • 7-25Dijkstra0distpre7-3


    5 4401880

    7-25

    10

    40

    4

    0

    20 60 10 65

    65

    80

    20

    35

    30 70

    5

    60

    1

    40

    20

    15

    3

    30

    35

    2

    20

    70

    15 80


    5 4401880

    7-3 distpre


    5 7 2

    5.7.2

    DijkstraG=(VE)DijkstraO(n3)

    (Floyd)O(n3)


    5 4401880

    0 i =j

    A[i][j]=

    Wij ij<vi,vj>E wij

    ij<vi,vj>E

    • 1

    • S()AA[i][j]ViSVj

      • S={ } A[i][j]

    Vk SA[i][j]

    A[i][j]=Min{A[i][j] , (A[i][k]+A[k][j]) }


    5 4401880

    VjS(Vk)VjVk

    GS

    2

    Path[n][n](n) Path[i][j]ViVj

    Path[i][j]=kViVj Vk (Vi , , Vk , , Vj) (Vi , , Vk)(Vk , , Vj)ViVkVkVjPath[i][k]Path[k][j]


    5 4401880

    0 2 8

    2

    V0

    V1

    0 4

    8

    50

    4

    5

    V2

    7-26

    Path[i][j]=-1ViVj (S)VkSA[i][j]Path[i][j]=k

    7-4Floyd7-26


    5 4401880

    7-4 Floyd

    K=1

    K=2

    k=0

    A

    Path

    0 2 6

    0 2 6

    0 2 8

    0 2 8

    -1 -1 1

    -1 -1 -1

    -1 -1 1

    -1 -1 -1

    -1 -1 -1

    0 4

    -1 -1 -1

    0 4

    2 -1 -1

    0 4

    9 0 4

    -1 -1 -1

    5 7 0

    570

    -1 0 -1

    -1 -1 -1

    -1 0 -1

    -1 0 -1

    50

    570

    { 0, 1 }

    { 0, 1, 2 }

    S

    { }

    { 0 }

    Path[i][j]

    V0V1 { 0, 1 } 2

    V0V2 { 0, 1, 2 } 6

    V1V0 { 1, 2, 0 } 9


    5 4401880

    V1V2 { 1, 2 } 4

    V2V0 { 2, 0 } 5

    V2V1 { 2, 0, 1 } 7

    int A[MAX_VEX][MAX_VEX] ;

    int Path[MAX_VEX][MAX_VEX] ;

    void Floyd_path (AdjGraph *G)

    { int j, k, m ;

    for ( j=0; j<G->vexnum; j++)

    for ( k=0; k<G->vexnum; k++)

    { A[j][k]=G->adj[j][k] ; Path[j][k]=-1 ; }

    /* */


    5 4401880

    for ( m=0; m<G->vexnum; m++)

    for ( j=0; j<G->vexnum; j++)

    for ( k=0; k<G->vexnum; k++)

    if ((A[j][m]+A[m][k])<A[j][k])

    { A[j][k]=A[j][m]+A[m][k] ;

    Path[j][k]=k ;

    } /* APath */

    for ( j=0; j<G->vexnum; j++)

    for ( k=0; k<G->vexnum; k++)

    if (j!=k)

    { printf(%d%d:\n, j, k) ;

    printf(%d ,j) ; prn_pass(j, k) ;

    printf(%d , k) ;


    5 4401880

    printf(: %d\n,A[j][k]) ;

    }

    } /* end of Floyd */

    void prn_pass(int j , int k)

    { if (Path[j][k]!=-1)

    { prn_pass(j, Path[j][k]) ;

    printf(, %d , Path[j][k]) ;

    prn_pass(Path[j][k], k) ;

    }

    }


    5 4401880

    2

    ?

    ?

    n? ?

    n? ?

    G=(V,E)V={a,b,c,d,e} E={<a,b>, <a,d>, <b,a>, <c,b>, <c,d>, <d,e>,<e,a>, <e,b>, <e,c>}


    5 4401880

    7-27

    7-28

    a

    a


    5 4401880

    0

    1

    2

    3

    4

    v1

    a

    v2

    b

    v3

    6

    3

    9

    f

    v4

    5

    c

    v5

    e

    2

    4

    d

    7-27

    MAX_VEX-1

    7-30

    7-28

    6

    5

    V1

    V2

    1

    3

    4

    5

    2

    3

    10

    5

    7

    9

    4

    6

    V4

    15

    V3

    5

    9

    20

    4

    3

    2

    10

    5

    6

    8

    V5

    V6

    4

    15

    30

    3

    2

    2

    1

    4

    3

    2

    0

    4

    4

    0

    7-29

    10


    5 4401880

    ??

    7-27

    Prime2

    Kruskal

    7-29DijkstraV4

    7-30Floyd

    AOV7-31AOV


    5 4401880

    7-32

    GViVjS

    AOE7-33

    ?


    5 4401880

    V0

    0 1 1 0 0 0 0

    V1

    0 0 0 1 1 1 0

    V2

    0 0 0 0 1 0 1

    V3

    0 0 0 0 0 0 0

    0 0 0 0 0 0 1

    V4

    V5

    0 0 0 0 0 0 1

    V6

    0 0 0 0 0 0 0

    7-32

    a3=3

    a7=3

    7-31 AOV

    v3

    v5

    v1

    a11=4

    V1

    a8=5

    a1=5

    V2

    a4=12

    a14=2

    a12=5

    v9

    v8

    v6

    v0

    a6=3

    V3

    a2=6

    a13=2

    a9=1

    V4

    v2

    V5

    v7

    v4

    a5=3

    a10=4

    V6

    V7

    V8

    V9

    7-33 AOE


  • Login