用临接矩阵表示图
typedef struct GNode *ptrToGNode;
struct GNode{
int Nv;//顶点数
int Ne;//边数
weightType G[MaxVertexNum][MaxVertexNum];
DataType Data[MaxVertexNum];
};
typedef ptrToGNode MGraph;//以邻接矩阵存储的图类型
MGraph初始化
初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex;
MGraph CreateGraph(int VertexNum)
{ Vertex V,W;
MGraph Graph;
Graph=(MGraph)malloc(sizeof(struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
for(V=0;V<Graph->Nv;V++)
for(W=0;W<Graph->Nv;W++)
Graph->G[V][W]=0;
return Graph;
}
向MGraph中插入边
typedef struct ENode *ptrToNode;
struct ENode{
Vertex v1,v2;//有向边<v1,v2>
weightType Weight;//权重
};
typedef ptrToENode Edge;
void InsertEdge(MGraph Graph,Edge E)
{
Graph->G[E->V1][E->V2]=E->Weight;//插入边<v1,v2>
Graph->G[E->V2][E->V1]=E->Weight;//若是无向图,还要插入边<v2,v1>
}
完整地建立一个MGraph
*输入格式
Nv Ne
V1 V2 Weight
...
MGraph BuildGraph()
{ MGraph Graph;
Edge E;
Vertex V;
int Nv,i;
cin>>Nv;
Graph=CreatGraph(Nv);
cin>>Graph->Ne;
if(Graph->Ne!=0){
E=(Edge)malloc(sizeof(struct ENode)};
for(i=0;i<Graph->Ne;i++){
cin>>E->V1>>E->V2>>E->Weight;
InsertEdge(Graph,E);
}
}
for(v=0;v<Graph->Mv;v++)
cin>>Graph->Data[V];
return Graph;
}
简单方法:
int G[MAXN][MAXN],Nv,Ne;
void BuildGraph()
{ int i,j,v1,v2,w;
cin>>Nv;
for(i=0;i<Nv;i++)
for(j=0;j<Nv;j++)
G[i][j]=0;
cin>>Ne;
for(i=0;i<Ne;i++){
cin>>v1,v2,w;
G[v1][v2]=w;
G[v2][v1]=w;
}
}
用邻接表表示图
邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素。
typedef struct GNode *ptrToGNode;
struct GNode{
int Nv;//顶点数
int Ne;//边数
AdjList G;//邻接表
};
typedef ptrToGNode LGraph;//以邻接表方式存储的图类型
typedef struct Vnode{
ptrToAdjVNode FirstEdge;
DataType Data;
} AdjList[MaxVertexNum];
typedef struct AdjVNode *ptrToAdjVNode;
struct AdjVNode{
Vertex AdjV;
WeightType Weight;
ptrToAdjVNode Next;
};
LGraph初始化
初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex;
LGraph CreateGraph(int VertexNum)
{ Vertex V,W;
LGraph Graph;
Graph=(LGraph)malloc(sizeof(struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
for(v=0;v<Graph->Nv;v++)
Graph->G[v].FirstEdge=NULL;
return Graph;
}
向LGraph中插入边
void InsertEdge(LGraph Graph,Edge E)
{ ptrToAdjVNode NewNode;
NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));//插入边<v1,v2>,为v2建立新的邻接点
NewNode->AdjV=E->V2;
NewNode->Weight=E->weight;
NewNode->Next=Graph->G[E->V1].FirstEdge;//将v2插入v1的表头
Graph->G[E->V1].FirstEdge=NewNode;
NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV=E->V1;
NewNode->Weight=E->weight;
NewNode->Next=Graph->G[E->V2].FirstEdge;//将v1插入v2的表头
Graph->G[E->V2].FirstEdge=NewNode;
}