图的遍历

  • 邻接矩阵的DFS

    const int MAXN = 100;
    bool visited[MAXN];
    
    struct MGraph
    {
    	int vexs[MAXN];//顶点表
    	int arc[MAXN][MAXN];//邻接矩阵
    	int numEdges, numVertexes;//边,点的数量
    };
    
    void DFS(MGraph *G,int i)
    {
    	int j;
    	visited[i] = 1;
    	cout << G->vexs << ' ';//输出节点信息也可以进行其他操作
    	for (j = 0; j < G->numVertexes; j++)
    		if (G->arc[i][j] == 1 && !visited[j])
    			DFS(G, j);
    }
    
    void DFSTraverse(MGraph *G)
    {
    	int i;
    	for (i = 0; i < G->numVertexes; i++)//初始化
    		visited[i] = 0;
    	for (i = 0; i < G->numVertexes; i++)
    		if (!visited[i])//未访问过的顶点调用DFS,若是连通图,则只执行一次
    			DFS(G, i);
    }
    
  • 邻接表的DFS

    const int MAXN = 100;
    bool visited[MAXN];
    
    struct EdgeNode
    {
    	int adjvex;
    	EdgeNode *next;
    };
    
    struct VexNode
    {
    	int data;
    	EdgeNode *firstedge;
    };
    
    struct Grapha
    {
    	VexNode list[MAXN];
    	int numVertexes, numEdges;
    };
    
    void DFS(Grapha *G, int i)
    {
    	EdgeNode *p;
    	visited[i] = 1;
    	cout << G->list[i].data << ' ';//输出节点信息,也可以进行其他操作
    	p = G->list[i].firstedge;
    	while (p)
    	{
    		if (!visited[p->adjvex])
    			DFS(G, p->adjvex);
    		p = p->next;
    	}
    }
    
    void DFSTraverse(Grapha *G)
    {
    	for (int i = 0; i < G->numVertexes; i++)//初始化
    		visited[i] = 0;
    	for (int i = 0; i < G->numVertexes; i++)//若为连通图,只执行一次
    		if (!visited[i])
    			DFS(G, i);
    }
    
  • 邻接矩阵的BFS

    const int MAXN = 1000;
    int visited[MAXN];
    
    struct MGraph
    {
    	int vexs[MAXN];//顶点表
    	int arc[MAXN][MAXN];//邻接矩阵
    	int numEdges, numVertexes;//边,点的数量
    };
    
    void BFSTraverse(MGraph G)
    {
    	int i, j;
    	queue<int>Q;
    	for (int i = 0; i < G.numVertexes; i++)
    		visited[i] = 0;
    	for (int i = 0; i < G.numVertexes; i++)
    	{
    		if (!visited[i])
    		{
    			visited[i] = 1;
    			cout << G.vexs[i] << ' ';
    			Q.push(i);
    			while (!Q.empty())
    			{
    				int t = Q.front();
    				Q.pop();
    				for (int j = 0; j < G.numVertexes; j++)
    				{
    					if (G.arc[t][j] == 1 && !visited[j])
    					{
    						visited[j] = 1;
    						cout << G.vexs[j] << ' ';
    						Q.push(j);
    					}
    				}
    			}
    		}
    	}
    }
    
  • 邻接表的BFS

    const int MAXN = 1000;
    int visited[MAXN];
    
    struct EdgeNode			//边表节点
    {
    	int adjvex;//邻接点域(有向图中弧头下标)
    	EdgeNode *next;//指向下一个边表
    };
    struct VertexNode		//顶点表节点
    {
    	char data;//顶点域
    	EdgeNode *firstedge;//边表头指针
    };
    
    struct GraphAdjList//图
    {
    	VertexNode adjList[MAXN];//顶点表数组
    	int numVertexea, numEdges;//图中顶点数和边数
    };
    
    void BFSTraverse(GraphAdjList G)
    {
    	queue<int>Q;
    	for (int i = 0; i < G.numVertexea; i++)
    		visited[i] = 0;
    	for (int i = 0; i < G.numVertexea; i++)
    	{
    		if (!visited[i])
    		{
    			visited[i] = 1;
    			cout << G.adjList[i].data << ' ';
    			Q.push(i);
    			while (!Q.empty())
    			{
    				int t = Q.front();
    				Q.pop();
    				EdgeNode *p = G.adjList[t].firstedge;
    				while (p)
    				{
    					if (!visited[p->adjvex])
    					{
    						visited[p->adjvex] = 1;
    						cout << G.adjList[p->adjvex].data << ' ';
    						Q.push(p->adjvex);
    					}
    					p = p->next;
    				}
    			}
    		}
    	}
    }
    
posted @ 2019-09-05 10:47  夜烛灯花  阅读(189)  评论(0编辑  收藏  举报