题目:https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1148
分析:
题目不难,但要注意题目涉及的图是无向图,所以建议按照邓公教材的风格,使用三个状态来表示当前顶点未发现,即从未入队,已发现,即在队中,已访问,即入队过,在主函数中调用即可,注意要使用邻接表。
代码:
#include<iostream>
#define MAXSIZE 10001
#define UNDISCOVERED 0
#define DISCOVERED 1
#define VISITED 2
using namespace std;
struct EdgeNode{
int vsub;
EdgeNode* succ;
};
struct VertexNode{
EdgeNode* fstEdge;
};
VertexNode adjList[MAXSIZE];
int queue[MAXSIZE],status[MAXSIZE],front=0,rear=0,i,j,k,m,n;//注意全局数组元素自动初始化为0
int BFS(int v){
queue[rear]=v;rear=(rear+1)%MAXSIZE;
status[v]=DISCOVERED;//当前顶点已发现,入队
while(front!=rear){
v=queue[front];front=(front+1)%MAXSIZE;
for(EdgeNode* e=adjList[v].fstEdge;e;e=e->succ)
switch(status[e->vsub]){
case UNDISCOVERED:queue[rear]=e->vsub;rear=(rear+1)%MAXSIZE;
status[e->vsub]=DISCOVERED;break;//访问队外未发现的邻居,则入队
case DISCOVERED:return -1;//访问队中已发现的邻居,则失败
}//若访问已访问的顶点,则忽略
status[v]=VISITED;//当前顶点访问完毕
}
return 1;
}
int main(){
cin>>n>>m;
while(m--){//创建无向图
cin>>i>>j;
EdgeNode* t=new EdgeNode;t->vsub=j;
t->succ=adjList[i].fstEdge;adjList[i].fstEdge=t;
t=new EdgeNode;t->vsub=i;
t->succ=adjList[j].fstEdge;adjList[j].fstEdge=t;
}cout<<BFS(1);//因为是无向图,不需从多个可能的顶点出发,只需从一个顶点出发即可遍历全图
return 0;
}