bfs是搭配队列进行搜索的,而元素及元素之间的关系用邻接表或邻接矩阵表示
//bfs一般要用到队列,邻接矩阵(或邻接表)
#define maxn 200010
#define maxm 400010
typedef struct{ //把顶点的信息归纳为节点
int v; //v为顶点的值
int next; //该顶点的下一个顶点的地址
}edge;
edge Edges[maxm];
int edgecount;
int head[maxn]; //每个节点的地址
void initedges() //此时没有元素存入,所以链表为空,head = -1
{
edgecount = 0;
memset(head, -1, sizeof(head));
}
void addedges(int u, int v) //头插法插入元素
{
Edges[edgecount].v = v;
Edges[edgecount].next = head[u];
head[u] = edgecount;
edgecount++;
}
void bfs(int n, int s, bool visit[maxn]) //利用队列进行bfs
{
int q[maxn], i;
int front = 0, rear = 0;
for (i = 0; i < n; i++)
{
visit[i] = false;
}
visit[s] = true;
q[rear++] = s;
while (front < rear)
{
int u = q[front++];
for (int e = head[u]; e != -1; e = Edges[e].next)
{
int v = Edges[e].v;
if (!visit[v])
{
visit[v] = true;
q[rear++] = v;
}
}
}
}
bool validPath(int n, int** edges, int edgesSize, int* edgesColSize, int source, int destination) {
initedges();
for (int i = 0; i < edgesSize; i++)
{
int u = edges[i][0];
int v = edges[i][1];
addedges(u, v);
addedges(v, u);
}
bool visit[maxn];
bfs(n, source, visit);
return visit[destination];
}