图的建立及遍历(基于邻接矩阵)

# include<iostream>
# include<cstring>
# include<queue>
using namespace std;
const int maxn=100;
bool visit[maxn];
typedef struct node{
int adj;//边之间关系	
}arccell;   //此处有的教材加了个 adj[maxn][maxn],然后在graph中定义 adj arcs 跟我直接定义二维数组是一样的。
typedef struct graph{
     char vertex[maxn];  //顶点集合 
	arccell arcs[maxn][maxn];//邻接矩阵   
	int vertexnum,edgenum;  //顶点数,边数. 
}graph;
graph g;
queue<char> q;
int locate(graph g,char s)
{
	int i;
	for(i=0;i<g.vertexnum;i++)
	   {
	   	if(g.vertex[i]==s)
	   	    return i;
	   }
	   
	 if(i==g.vertexnum)
	   return -1;  
}
bool input_graph(graph&g)
{
	cin>>g.vertexnum>>g.edgenum;
	for(int i=0;i<g.vertexnum;i++)
	   cin>>g.vertex[i];     //初始化顶点集 
	
	//初始化邻接矩阵 
	for(int i=0;i<g.vertexnum;i++)
	 for(int j=0;j<g.vertexnum;j++)
      {
	      g.arcs[i][j].adj=0; 	
		}
		char v,u;
		int m,w;
	for(int i=0;i<g.edgenum;i++)
	  {
	  	cin>>v>>u;
	  	m=locate(g,v);
	  	w=locate(g,u);
	  	g.arcs[m][w].adj=1;
		  }	
	 return true;  
}
void output_arcs(graph g)
{
	 for(int i=0;i<g.vertexnum;i++)
	     {
		   for(int j=0;j<g.vertexnum;j++)
		     cout<<g.arcs[i][j].adj<<" ";
		   cout<<endl;  
	     } 
	  
}
void dfs(int i)
{
	visit[i]=true;
	cout<<g.vertex[i];
	for(int j=0;j<g.vertexnum;j++)
	{
		if(g.arcs[i][j].adj&&!visit[j])
		   dfs(j);
	}
}
void bfs(int u)
{
	
	q.push(g.vertex[u]);
	while(!q.empty())
	{
		char ss=q.front();q.pop();
		int i=locate(g,ss);
		visit[i]=true;
		cout<<ss<<" ";
		for(int j=0;j<g.vertexnum;j++)
		   if(g.arcs[i][j].adj&&!visit[j])
		    { visit[j]=true;
			  q.push(g.vertex[j]);
		}
	}
	
	
}
int main()
{
	if(input_graph(g))
	   output_arcs(g);
	memset(visit,0,sizeof(visit));//访问标记初始化. 
	for(int i=0;i<g.vertexnum;i++)
	   if(!visit[i]) bfs(i);   
	     return 0;
 }

如有错误,还请指出,不胜感激。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值