//program to traverse a graph using breadth first search traversal
#include<iostream.h>
#include<conio.h>
class queue
{
	int q[20],front,rear;
	public:
		queue()
		{
			front=rear=0;
		}
		void insert(int);
		int delet();
		int isempty();
};
void queue::insert(int item)
{
	if(front==0)
		front++;
	q[++rear]=item;
}
int queue::delet()
{
	int item;
	item=q[front++];
	if(front>rear)
		front=rear=0;
	return item;
}
int queue::isempty()
{
	if(front==0)
		return 1;
	return 0;
}
class graph
{
	private:
		int n,a[20][20],reach[20];
		queue qu;
	public:
		graph();
		void setdata();
		void bfs();
};
void graph::graph()
{
	int i;
	for(i=0;i<=20;i++)
		reach[i]=0;
}
void graph::setdata()
{
	int i,j;
	cout<<"\nEnter number of vertices: ";
	cin>>n;
	cout<<"\nEnter adjacency matrix: ";
	for(i=1;i<=n;i++)
	{
		cout<<"\nEnter "<<i<<" row: ";
		for(j=1;j<=n;j++)
			cin>>a[i][j];
	}
}
void graph::bfs()
{
	int v=1,i;
	qu.insert(v);
	reach[v]=1;
	while(!(qu.isempty()))
	{
		v=qu.delet();
		cout<<v<<"\t";
		for(i=1;i<=n;i++)
			if(a[v][i]==1 && reach[i]==0)
			{
				qu.insert(i);
				reach[i]=1;
			}
	}
}
void main()
{
	graph g;
	clrscr();
	g.setdata();
	cout<<"\n\nDFS traversal of given graph is: \n\t";
	g.bfs();
	getch();
}