怎样在程序中表示一张图:
1.邻接矩阵表示法
2.邻接表表示法
图的建立(邻接矩阵表示):
#define MaxVertexNum 100
#define INFINITY 65535
typedef int Vertex;//用顶点的下标来表示顶点
typedef int WeightType;//边的权值设为整型
typedef char DataType;//顶点存储的数据类型为自符型
//边的定义
typedef struct ENode *PtrToENode;
struct ENode{
Vertex V1,V2;//有向边<V1,V2>
WeightType Weight;//权重
};
typedef PtrToENode Edge;
//图结点的定义
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv;//顶点数
int Ne;//边数
WeightType G[MaxVertexNum][MaxVertexNum];
DataType Data[MaxVertexNum];
};
typedef PtrToGNode MGraph;
MGraph CreateGraph(int VertexNum)
{
//初始化一个有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++)
fro(W=0;W<Graph->Nv;W++)
Graph->G[V][W] = INFINITY;
return Graph;
}
void InsertEdge(MGraph Graph,Edge E)
{
Graph->G[E->V1][E->V2] = E->Weight;
Graph->G[E->V2][E->V1] = INFINITY;
}
MGraph BuildGraph()
{
MGraph Graph;
Edge E;
Vertex V;
int Nv,i;
scanf("%d",&Nv);
Graph = CreateGraph(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);
}
}
}
图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)
void DFS(Vertex V)
{
visited[V] = true;
for(V的每个邻接点W)
if(!visited[W])
DFS(W);
}
void BFS(Vertex V)
{
visited[V] = true;
Enqueue(V,Q);
while(!Isempty(Q)){
V = Dequeue(Q);
for(V的每个邻接点W)
if(!visited[W]){
visited[W] = true;
Enqueue(W,Q);
}
}
}
图的简单表示
int G[MAXN][MAXN],Nv,Ne;
void BuildGraph()
{
int i,j,v1,v2,w;
scanf("%d",&Nv);
for(i=0;i<Nv;i++)
for(j=0;j<Nv;j++)
G[i][j] = 0;
scanf("%d",&Ne);
for(i=0;i<Ne;i++)
{
scanf("%d %d %d",&v1,&v2,&w);
//InsertEdge
G[v1][v2] = w;
G[v2][v1] = w;
}
}