图(数据结构与算法)
图的分类
图的存储方式
邻接矩阵
#define MAX_VERTEX 30
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct {
VertexType vexs[MAX_VERTEX];
int arcs[MAX_VERTEX][MAX_VERTEX];
int vexnum,arcnum;
GraphKind kind;
}MGraph;
邻接表
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
int weight;
} ArcNode;
typedef struct VertexNode{
VertexType data;
ArcNode * firstarc;
}VertexNode, AdjList[MAX_VERTEX];
typedef struct {
AdjList vertices;
int vexnum,arcnum;
GraphKind kind;
}ALGraph;
十字链表(有向图)
typedef struct ArcNode{
int tail;
int head;
struct ArcNode * tnext;
struct ArcNode * hnext;
} ArcNode;
typedef struct VertexNode{
char data;
ArcNode *firstIn;
ArcNode * firstOut;
} VertexNode;
typedef struct CrossList{
VertexNode *adjlist;
int vexnum,arcnum;
} CrossList;
邻接多重矩阵(无向图)
typedef struct EdgeNode {
int iVex;
int jVex;
struct EdgeNode *iNext;
struct EdgeNode *jNext;
} EdgeNode;
typedef struct VertexNode {
char data;
EdgeNode *firstEdge;
} MVertexNode;
typedef struct {
MVertexNode *vertices;
int vertexNum;
} AMLGraph;
图的遍历
DFS
void DFS (ALGraph G,int v,bool visited,status(*visit)(ALGraph,int)){
visited[v]=true;
visit(G,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])
DFS(G,w,visited,visit);
}
void TraverseGraph(ALGraph G,status(*visit)(ALGraph,int)){
bool visited[MAXVEX];
for(int i=0;i<G.vexnum;i++)
visited[i]=false;
for(int v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v,visited,visit);
}
BFS
void DFSTraverse(ALGraph G,status(*visit)(ALGraph,int)){
bool visited[MAX_VERTEX];
for(int v=0; v<G.vexnum; v++){
visited[v]=false;
}
LinkQueue Q;
InitQueue(Q);
for(int v=0;v<G.vexnum;v++){
if(!visited[v]){
visited[v]=true;
visit(G,v);
EnQueue(Q,v);
while(!QueueEmpty(Q)){
DeQueue(Q,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
if(!visited[w]){
visited[w]=true;
visit(G,w);
EnQueue(Q,w);
}
}
}
}
}
}
最小生成树
prim算法