1. 程式人生 > >圖論 圖的表示

圖論 圖的表示

圖的定義:
表示多對多的關係;包含頂點和邊;分為有向圖和無向圖;無向圖是對稱的;
如圖
在這裡插入圖片描述
圖有兩種表示方式;
鄰接矩陣:
二維陣列表示;下標表示節點,內容可以是權重,如G[i][j] ,表示i和j節點的關係,如果
G[i][j] 中的內容0,表示無連線,1表示有連線,或可以用其它值表示權重;

圖的鄰接矩陣表示;
#define Maxnum 100  //最大節點數
#define  null  0 // 空值
typedef struct ENode* Edge;
struct ENode
{
	int V1,V2; 兩個頂點; <V1,V2> V1->V2的有向邊
	int
weight; //權值 } typedef struct GNode * MGraph; struct GNode { int Nv; // 圖中的頂點數; int Ne; // 圖中的邊數; int G[Maxnum][Maxnum] //矩陣儲存資料; } MGraph CreateGraph(int VertexNum) //建立空圖 { MGraph G = (MGraph)malloc(sizeof(struct GNode)); G->Nv = VertexNum; G->Ne = 0; for(int i=0;i<G->Nv;i++) for(int j=0;
j<G->Nv;j++) G->G[i][j] = null; return MGraph; } void InsertEdge(MGraph Graph, Edge E) //向圖中插入邊 { Graph->G[E->V1][E->V2] = E->weight; //若為無向邊,還要再存一邊; Graph->G[E->V2][E->V1] = E->weight; } MGraph BuildGraph() //初始化圖 { MGraph G; Edge E; int Nv; scanf("%d",&Nv)
; //輸入頂點數 G = CreateGraph(Nv); scanf("%d",&G->Ne); //輸入邊數 if(G->Ne!=0) { E = (Edge)malloc(sizeof(struct ENode)); for(int i=0;i<G->Ne;i++) //插入邊數 { scanf("%d%d%d",&E->V1,&E->V2,&E->weight); //輸入邊 InsertEdge(G,E);// 插入邊; } } return G; }

鄰接表 實現圖
在這裡插入圖片描述

圖的鄰接表實現
#define Maxnum 100  // 最大頂點個數
typedef struct ENode * Edge;
struct ENode
{
	int V1,V2; // <V1,V2>;
	int weight; // 權值
}

typedef struct AdjNode * PtrToAdjVNode;
struct AdjNode
{
	int AdjV; // 下標
	int weight;//權值
	PtrToAdjVNode next; // 指向下一個節點;
}

typedef struct Vnode
{
	PtrToAdjVNode FirstEdge; // 頭指標;
}AdjList[Maxnum];

typedef struct GNode * LGraph ;
struct GNode
 {
	int Nv;     /* 頂點數 */
	int Ne;     /* 邊數   */
	AdjList G;  /* 鄰接表 */
};
LGraph CreateGraph(int VertexNum) // 初始化一個無邊的圖
{
	LGraph  G = (LGraph)malloc(sizeof(struct GNode));
	G->Nv = VertexNum;
	G->Ne = 0;
	for(int i=0;i<G->G->Nv;i++)
	{
		G->G[i].FirstEdge = NULL;
	}
}
void InsertEdge(LGraph Graph, Edge E) // 插入邊
{
	PtrToAdjVNode  NewNode;
	NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjNode));
	NewNode = E->V2;
	NewNode = E->weight;
	NewNode->next = Graph->G[E->V1];
	Graph->G[E->V1].FirstEdge = NewNode;
	// 若是無向圖,則V2->V1;
	NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode = E->V1;
	NewNode = E->weight;
	NewNode->next = Graph->G[E->V2];
	Graph->G[E->V2].FirstEdge = NewNode;
}
LGraph BuildGraph() // 初始化圖
{
	LGraph Graph;
	Edge E;
	int Nv;
	scanf("%d", &Nv);   /* 讀入頂點個數 */
	Graph = CreateGraph(Nv); /* 初始化有Nv個頂點但沒有邊的圖 */
	scanf("%d", &(Graph->Ne));   /* 讀入邊數 */
	if(Graph->Ne != 0)
	{
		E = (Edge)malloc(sizeof(struct ENode)); /* 建立邊結點 */
		for (i = 0; i < Graph->Ne; i++) 
		{
			scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);
			InsertEdge(Graph, E);
		}
	}
	return Graph;
}