圖論 圖的表示
阿新 • • 發佈:2018-11-22
圖的定義:
表示多對多的關係;包含頂點和邊;分為有向圖和無向圖;無向圖是對稱的;
如圖
圖有兩種表示方式;
鄰接矩陣:
二維陣列表示;下標表示節點,內容可以是權重,如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;
}