圖(1)--圖的相關術語與圖的儲存結構

fan_rockrock發表於2014-02-18

一:圖的基本術語:

       1.無向圖:圖G中的每條邊都是無方向的

       2.有向圖:圖G中的每條邊都是有方向的;

       3.完全圖:圖G任意兩個頂點都有一條邊相連線;

       4.有向完全圖:若n個頂點的有向圖有n(n-1)條邊, 稱為有向完全圖

       5.簡單路徑:路徑上各頂點 v1,v2,...,vm 均不互相重複

       6.迴路(環):路徑上第一個頂點 v1 與最後一個頂點vm 重合

       7.連通圖:圖中任意一對頂點都是連通的, 則稱此圖是連通圖

       8.強連通圖:有向圖中, 若對於每一對頂點vi和vj, 都存在一條從vi到vj和從vj到vi的路徑, 則稱此圖是強連通圖。

       9.頂點的度:頂點V的度  TD(v) = ID(v) + OD(v)    ID表示入度  OD表示出度

       10.生成樹: 一個連通圖的生成樹是一個極小連通子圖,它含有圖中全部頂點,但只有足以構成一棵樹的n-1條邊

                            

      

二.圖的儲存結構

1.鄰接矩陣儲存

(1)無向圖(有向也一樣,不對稱而已)


        A[i][j]=1表示頂點Vi和Vj之間有邊相連

(2)帶權圖(有向無向一樣理解)



(3)儲存結構:

#define INFINITY INT_MAX     // 最大值∞
#define MAX_VERTEX_NUM 20    // 最大頂點個數
typedef enum {DG, DN, UDG, UDN} GraphKind;
                          //圖型別(有向圖/網,無向圖/網)
typedef struct ArcCell {//弧資訊
   VRType adj;   // 頂點的關係型別。對無權圖,用1或0表示相鄰否;對帶權圖,則為權值型別,adj表示權值
   InfoType *info;    // 指向該弧相關資訊的指標(如果有其他資訊,則指向它)
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
     VertexType vexs[MAX_VERTEX_NUM]; // 描述頂點的陣列
     AdjMatrix arcs; // 鄰接矩陣
     int vexnum, arcnum; // 圖的當前頂點數和弧(邊)數
     GraphKind kind; // 圖的種類標誌
} MGraph;
以建立無向網圖為例來理解這種結構:

Status CreateUDN(MGraph &G){
    sacnf( &G.vexnum, &G.arcnum, &IncInfo); 
    for(i=0;i<G.vexnum;++i) scanf(&G.vexs[i]);    //構造頂點向量
    for(i=0;i<G.vexnum;++i) //初始化鄰接矩陣
         for(j=0;j<G.vexnum;++j) G.arcs[i][j]={INFINITY,NULL}; // {adj,info}
    for(k=0;k<G.arcnum;++k){  //構造鄰接矩陣
         scanf(&v1,&v2,&w); //輸入一條邊依附的頂點及權值
         i=LocateVex(G,v1);j=LocateVex(G,v2);   //找到v1和v2在G中位置
        G.arcs[i][j].adj=w;//弧<v1,v2>的權值
        if (IncInfo) Input (*G.arcs[i][j].info);//如果IncInfo不為0,則就輸入弧相關資訊
        G.arcs[j][i]=G.arcs[i][j];  //置<v1,v2>的對稱弧<v2,v1> }
  return OK;
}//CreateUDN 

2.鄰接表儲存:

           對每個頂點vi 建立一個單連結串列,把與vi 有關聯的邊的資訊(即度或出度邊)連結起來,表中每個結點都設為3個域;

           每個單連結串列還應當附設一個頭結點(設為2個域),存vi資訊;每個單連結串列的頭結點另外用順序儲存結構儲存。

          

          例子:

               

          注:因為讀入的結點連線順序不一樣,所以鄰接表不一樣!(有向圖同理)


typedef struct ArcNode
{
   int adjvex;//該弧鄰接到的頂點的位置
   InfoType *info;//該弧相關資訊的指標(比如說可以使帶權圖的權值)
   struct ArcNode* nextArc;   
}ArcNode;
typedef struct VNode
{
   VertexType data;//頂點的資料資訊
   ArcNode* firstArc;//指向第一個依附該結點的弧
}VNode,AdjList[MAX_VERTEX_NUM];//要線性的順序儲存組合在一起,所以採用陣列;
typedef struct ALGraph
{
   AdjList vertices;
   int verNum,arcNum;//圖的定點數和弧樹
   int kind;//圖的種類  
}ALGraph;

            也是以建立鄰接表圖為例:

void CreateUDN(ALGraph &ga)
{
	ArcNode *p;
	char name1[40],name2[40];
	int i,j,k;
	double w;
	printf("請輸入頂點數和弧數:");
	scanf("%d%d",&ga.vexNum,&ga.arcNum);
	printf("請依次輸入頂點名:\n");
	for(i=0;i<ga.vexNum;i++)
	{
		scanf("%s",ga.vertices[i].data);
		ga.vertices[i].firstarc=NULL;
	}
	for(k=0;k<ga.arcNum;k++)
	{
		printf("請輸入相鄰的兩個定點和權值:");
		scanf("%s%s%lf",name1,name2,&w);
		i=LocateVex(ga,name1);
		j=LocateVex(ga,name2);
		p=new ArcNode;
		p->adjvex=j;
		p->adj=w;
		p->nextarc=ga.vertices[i].firstarc;//先進後出式插入
		ga.vertices[i].firstarc=p;
	}
}



相關文章