输入两个数字,代表图的顶点数和边数 n , e
后面 n 行,每一行的第一个数字 ve 代表与这个顶点相邻的点的个数
后面 ve 个数,代表与这个数字相邻点的编号(从0开始)
//#include <stdio.h>
#include<bits/stdc++.h>
//typedef enum {false, true} bool;
#define MaxVertexNum 10 /* 最大顶点数设为10 */
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV; /* 邻接点下标 */
PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
};
/* 顶点表头结点的定义 */
typedef struct Vnode{
PtrToAdjVNode FirstEdge; /* 边表头指针 */
} AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
AdjList G; /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
LGraph CreateGraph() /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
{
memset(Visited, 0, sizeof(Visited)); //初始化Visited数组
GNode *PtrGraph;
PtrGraph = (GNode*)malloc(sizeof(GNode)); //给这个图开辟一个空间
int n, e;
scanf("%d %d", &n, &e);
PtrGraph->Nv = n; PtrGraph->Ne = e; //图的点和边数
for(int i = 0; i < PtrGraph->Nv; i++) //从第一个顶点开始
{
int ve, x;
AdjVNode *cur, *ptr;
scanf("%d", &ve); //与这个顶点相连的点数
//表头节点的构造
(PtrGraph->G[i]).FirstEdge = (AdjVNode*)malloc(sizeof(AdjVNode));
scanf("%d", &x); (PtrGraph->G[i]).FirstEdge->AdjV = x; (PtrGraph->G[i]).FirstEdge->Next = NULL;
cur = (PtrGraph->G[i]).FirstEdge->Next;
ptr = (PtrGraph->G[i]).FirstEdge;
//链表内部的构造
for(int i = 1; i < ve; i++)
{
scanf("%d", &x);
cur = (AdjVNode*) malloc(sizeof(AdjVNode));
cur->AdjV = x; ptr->Next = cur; cur->Next = NULL;
ptr = cur;
}
}
return PtrGraph;
}
void Visit( Vertex V )
{
printf(" %d", V);
}
void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
{
Visit(S); Visited[S] = true;
int Que[100];
int Front = 0; //队头位置
int Last = 0; //要插入的位置
Que[Last] = S;
Last++;
while(Front != Last)
{
int v = Que[Front]; Front++;
if(!Visited[v])
{
Visit(v);
Visited[v] = true;
}
//PtrToAdjVNode p = ((*Graph).G[v]).FirstEdge;
PtrToAdjVNode p = Graph->G[v].FirstEdge;
while(p != NULL)
{
if(!Visited[p->AdjV])
{
Que[Last] = p->AdjV;
Last++;
}
p = p->Next;
}
}
return ;
}
int main()
{
LGraph G;
Vertex S;
G = CreateGraph();
scanf("%d", &S);
printf("BFS from %d:", S);
BFS(G, S, Visit);
return 0;
}