清华OJ:PA3-1 无线广播(Broadcast)三状态遍历全图

题目: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;
}

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_37729102/article/details/83717338
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞