1. 程式人生 > >從小白開始自學資料結構——第十二天【圖及其基本概念和鄰接表的定義】

從小白開始自學資料結構——第十二天【圖及其基本概念和鄰接表的定義】

    圖的定義
       圖是由頂點的有窮非空集合和頂點之間的邊的集合組成,通常表示為:G(V,E).
           其中G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

    圖的基本概念:
        頂點:
            圖的資料元素(就像線性表中的元素,樹中的結點)
        無向邊:
            若頂點V[i]到V[j]之間的邊沒有方向,則稱這條邊為無向邊。
                用無序偶對(V[i], V[j])來表示。
        無向圖:
            圖中任意兩個頂點之間的邊都是無向邊的圖
        無向完全圖:
            在無向圖中,如果任意兩邊都存在邊,則稱該圖為無向完全圖。
                含有n個頂點的無向完全圖有 N*(N-1)/2 條邊
        有向邊: 
            若頂點V[i]到V[j]之間有方向,則稱這條邊為有向邊,也稱為弧
                用有序偶對<V[i],V[j]>來表示。
        有向圖:
            若圖中任意兩個頂點之間的邊都是有向邊,則稱該圖為有向圖。
        有向完全圖:
            在有向圖中,如果任意兩個頂點之間都存在方向互為相反的兩條弧
                則稱該圖為有向完全圖。
        弧:
            連結頂點A到頂點D的有向邊就是弧,A是弧尾,D是弧頭,<A,D>表示弧。
                (弧頭、弧尾的順序不能寫反)
             無向邊用()表示,有向邊用<>表示。
        簡單圖:
            在圖中,若不存在頂點到自身的邊,且同一條邊不重複出現,則稱這樣的圖為簡單圖。
        稀疏圖(稠密圖):
            邊或弧很少的圖稱為稀疏圖,反之則稱為稠密圖。
        權和網:
            與圖的邊或弧相關的數叫做權,帶權的圖通常成為網。
        子圖:
            設圖G=(V,{E}),圖G'=(V',{E'}),如果v'是v的子集,E'是E的子集
                則G'是G的子圖。
        度:
            頂點V的度是和V相關聯的邊的數目。
                記為TD(V)
        入度和出度:
            以頂點V為頭的弧的數目稱為V的入度,記為ID(InDegerr)
            以頂點V為尾的弧的數目稱為V的出度,記為Od(OutDegree)
            頂點V的度為TD(V)=ID(v)+OD(v)
        路徑的長度:
            路徑的長度是路徑上的邊或弧的數目。
        簡單路徑
            序列中頂點不重複出現的路徑稱為簡單路徑            
        迴路(環)
            第一個頂點到最後一個頂點相同的路徑稱為迴路或環。
        簡單迴路(簡單環)
            除了第一個頂點和最後一個頂點之外,其餘頂點不重複出現的迴路。
                為簡單迴路(簡單環)
        連通: 
            在無向圖中如果從V'到V有路徑,則稱V和V'是連通的。
        連通圖:
            若圖中任意兩個頂點都是連通的,則稱該圖為連通圖。
        連通分量:
            無向圖的極大連通子圖,稱為連通分量。
                1.要是子圖
                2.子圖要是連通的
                3.連通子圖含有極大頂點數
                4.具有極大頂點數的連通子圖包含依附於這些頂點的所有邊。
        強連通圖:
            在有向圖G中,對於圖中每一對不相等的頂點V[i],V[j]
                從V[i]到V[j]和從V[j]到V[i]都存在路徑,
                    則圖G為強連通圖。
        記錄到這裡我又想吐了
        強連通分量:
            有向圖中的極大強連通子圖稱作有向圖的強連通分量。
        連通圖的生成樹:
            含有圖中全部n個頂點,但只有足以構成一顆樹的n-1條邊。
                如果一個圖有n個頂點和小於n-1條邊,則是非連通同
                如果多於n-1條邊,必定構成一個環
                    因為這條邊使得它依附的那兩個頂點之間有了第二路徑。
                但是有n-1條邊不一定是生成樹。
        有向樹:
            如果一個有向圖恰有一個頂點的入度為0,其餘頂點入度為1,則是一顆有向樹。
                一個有向圖的生成森林由若干棵有向樹組成,含有圖中全部頂點
                    但是隻有足以構成若干棵不相交的有向樹的弧。..


                                   |--頂點
                         |—無向圖|
                         |         |--邊(帶權則稱為網)
          丨—有無方向—| 
          丨             |         |--頂點
          丨             |—有向圖|      |--弧頭
          丨                       |--弧|        (帶權則稱為網)
          丨                             |--弧尾
          丨
          丨                         |--稀疏圖
          丨             |—邊的多少|
          丨             |           |--稠密圖
          丨             |
          丨—邊或弧  —| —任意兩頂點存在邊為完全圖,有向的為有向完全圖
          丨             |
          丨             |
          丨             |—無重複的邊或頂點到自身的邊叫簡單圖(主要研究的就是這個)
          丨
          丨             |—無向圖頂點的邊數叫度
圖的基本概念——丨—頂點    —|            |--入度
          丨             |有向圖頂點|
          丨                         |--出度
          丨
          丨
          丨             |--連通(兩頂點存在路徑)
          丨             |
          丨—路徑    —| --環   (如果路徑回到起始點)
          丨             |
          丨             |--簡單路徑(不重複)
          丨
          丨             |--強連通圖(有向連通圖)
          丨             |
          丨—連通圖  —| --連通分量(子圖極大連通)
          丨             |
          丨             |--強連通分量(有向的子圖極大連通)
          丨                           
          丨             |--生成樹(無向圖連通且n個頂點,n-1條邊)
          丨             |
          丨—樹      —| --有向樹(有向圖其中一個頂點入度為0,其餘頂點入度為1)
                         |
                         |--生成森林(一個有向圖由脫崗額有向樹構成生成森林)

我感覺這個結構圖應該是沒有錯版的。。。

/*******************************
       鄰接表的建立
*******************************/

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef char VertexType;//頂點型別
typedef int EdgeType;   //權值型別

#define MAXVEX 100

typedef struct EdgeNode //邊表結點
{
    int
adjvex; //鄰接點域,儲存對應頂點的下標 EdgeType whight; //儲存權值,用於網圖 struct EdgeNode * next; //鏈域,指向下一個鄰接點 }EdgeNode; typedef struct VertexNode //頂點表結點 { VertexType date; //頂點域,儲存頂點的資訊 EdgeNode *firstedge; //邊表頭指標 }VertexNode, AdjList[MAXVEX]; typedef
struct { AdjList adjList; int numVertexes, numEdges; //圖中當前頂點數和邊數 }GraphAdjList; void create_algraph (GraphAdjList *G); int main() { return 0; } void create_algraph (GraphAdjList *G) { int i, j, k; EdgeNode *e; printf ("輸入頂點數和邊數:\n"); scanf ("%d,%d",&G->numVertexes,&G->numEdges);//建立頂點表 for (i = 0;i<G->numVertexes; i++) { scanf (&G->adjList[i].date); //輸入頂點資訊 G->adjList [i].firstedge=NULL; //將邊表置為空 } for (k=0;k<G->numEdges;k++) //建立邊表 { printf ("輸入邊(vi,vj)上的頂點序號:\n"); scanf ("%d,%d",&i,&j); //輸入vi,vj頂點序號 e=(EdgeNode *)malloc(sizeof(EdgeNode)); //向記憶體申請空間//生成邊表結點 e->adjvex=j; //鄰接序號為j e->next=G->adjList[i].firstedge; //將e指標指向當前頂點指向的結點 G->adjList[i].firstedge=e; //將當前頂點的指標指向e e=(EdgeNode *)malloc(sizeof(EdgeNode)); //鄰接序號為i e->adjvex=i; e->next=G->adjList[j].firstedge; G->adjList[i].firstedge=e; } }

今天有事,就不做題了,明天補上。。。。