從小白開始自學資料結構——第十二天【圖及其基本概念和鄰接表的定義】
阿新 • • 發佈:2019-02-03
圖的定義 圖是由頂點的有窮非空集合和頂點之間的邊的集合組成,通常表示為: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;
}
}
今天有事,就不做題了,明天補上。。。。