zoukankan      html  css  js  c++  java
  • 图(邻接矩阵)

    Node.h

    #pragma once
    
    class Node
    {
    public:
    	Node(char data = 0);
    	char m_cData;
    	bool m_bIsVisited;
    };
    

    Node.cpp

    #include "Node.h"
    
    Node::Node(char data)
    {
    	m_cData = data;
    	m_bIsVisited = false;
    }
    
    

    CMap.h

    #pragma once
    #include"Node.h"
    #include<iostream>
    #include<vector>
    using namespace std;
    class CMap
    {
    public:
    	CMap(int capacity);
    	~CMap();
    	bool addNode(Node* pNode);//添加顶点
    	void resetNode();//重置顶底
    	bool setValueToMatrixForDirectedGraph(int row, int col, int val = 1);//为有向图设置邻接矩阵
    	bool setValueToMatrixForUndirectedGraph(int row, int col, int val = 1);//为无向图设置邻接矩阵
    	void printMatrix();//打印邻接矩阵
    	void depthFirstTraverse(int nodeIndex);  //深度优先遍历
    	void breadthFirstTraverse(int nodeIndex);//广度优先遍历
    private:
    	bool getValueFromMatrix(int row, int col, int& val);//广度优先遍历实现函数
    	void breadthFirstTraverseImpl(vector<int>preVec);//
    private:
    	int m_iCapacity; //最多顶点数
    	int m_iNodeCount;//已经添加的顶点数
    	Node* m_pNodeArray;//用来存放顶点的数组
    	int* m_pMatrix;//用来存放顶点的邻接矩阵
    };
    

    CMap.cpp

    #include "CMap.h"
    CMap::CMap(int capacity)
    {
    	m_iCapacity = capacity;
    	m_iNodeCount = 0;
    	m_pNodeArray = new Node[m_iCapacity];
    	m_pMatrix = new int[m_iCapacity * m_iCapacity];
    	for (int i = 0; i < m_iCapacity * m_iCapacity; i++)
    	{
    		m_pMatrix[i] = 0;
    	}
    }
    
    CMap::~CMap()
    {
    	delete[] m_pNodeArray;
    	delete[] m_pMatrix;
    }
    
    bool CMap::addNode(Node* pNode)
    {
    	if (pNode == NULL)
    	{
    		return false;
    	}
    	m_pNodeArray[m_iNodeCount].m_cData = pNode->m_cData;
    	m_iNodeCount++;
    	return true;
    }
    
    void CMap::resetNode()
    {
    	for (int i = 0; i < m_iNodeCount; i++)
    	{
    		m_pNodeArray[i].m_bIsVisited = false;
    	}
    }
    
    bool CMap::setValueToMatrixForDirectedGraph(int row, int col, int val)
    {
    	if (row < 0 || row >= m_iCapacity)
    	{
    		return false;
    	}
    	if (col < 0 || col >= m_iCapacity)
    	{
    		return false;
    	}
    	m_pMatrix[row * m_iCapacity + col] = val;
    	return true;
    }
    
    bool CMap::setValueToMatrixForUndirectedGraph(int row, int col, int val)
    {
    	if (row < 0 || row >= m_iCapacity)
    	{
    		return false;
    	}
    	if (col < 0 || col >= m_iCapacity)
    	{
    		return false;
    	}
    	m_pMatrix[row * m_iCapacity + col] = val;
    	m_pMatrix[col * m_iCapacity + row] = val;
    	return true;
    }
    
    void CMap::printMatrix()
    {
    	for (int i = 0; i < m_iCapacity; i++)
    	{
    		for (int j = 0; j < m_iCapacity; j++)
    		{
    			cout << m_pMatrix[i * m_iCapacity + j] << " ";
    		}
    		cout << endl;
    	}
    }
    
    void CMap::depthFirstTraverse(int nodeIndex)
    {
    	int value = 0;
    	cout << m_pNodeArray[nodeIndex].m_cData << " ";
    	m_pNodeArray[nodeIndex].m_bIsVisited = true;
    	for (int i = 0; i < m_iCapacity; i++)
    	{
    		getValueFromMatrix(nodeIndex, i, value);
    		if (value == 1)
    		{
    			if (m_pNodeArray[i].m_bIsVisited)
    			{
    				continue;
    			}
    			else
    			{
    				depthFirstTraverse(i);
    			}
    		}
    		else
    		{
    			continue;
    		}
    	}
    }
    
    bool CMap::getValueFromMatrix(int row, int col, int& val)
    {
    	if (row < 0 || row >= m_iCapacity)
    	{
    		return false;
    	}
    	if (col < 0 || col >= m_iCapacity)
    	{
    		return false;
    	}
    	val = m_pMatrix[row * m_iCapacity + col];
    	return true;
    }
    
    void CMap::breadthFirstTraverse(int nodeIndex)
    {
    	cout << m_pNodeArray[nodeIndex].m_cData << " ";
    	m_pNodeArray[nodeIndex].m_bIsVisited = true;
    
    	vector<int>curVec;
    	curVec.push_back(nodeIndex);
    	breadthFirstTraverseImpl(curVec);
    }
    
    void CMap::breadthFirstTraverseImpl(vector<int> preVec)
    {
    	int value = 0;
    	vector<int>curVec;
    	for (int j = 0; j < (int)preVec.size(); j++)
    	{
    		for (int i = 0; i < m_iCapacity; i++)
    		{
    			getValueFromMatrix(preVec[j], i, value);
    			if (value != 0)
    			{
    				if (m_pNodeArray[i].m_bIsVisited)
    				{
    					continue;
    				}
    				else
    				{
    					cout << m_pNodeArray[i].m_cData << " ";
    					m_pNodeArray[i].m_bIsVisited = true;
    					curVec.push_back(i);
    
    				}
    			}
    		}
    	}
    	if (curVec.size() == 0)
    	{
    		return;
    	}
    	else
    	{
    		breadthFirstTraverseImpl(curVec);
    	}
    }
    

    源.cpp

    #include"Node.h"
    #include"CMap.h"
    
    int main()
    {
    	CMap* pMap = new CMap(8);
    	Node* pNodeA = new Node('A');
    	Node* pNodeB = new Node('B');
    	Node* pNodeC = new Node('C');
    	Node* pNodeD = new Node('D');
    	Node* pNodeE = new Node('E');
    	Node* pNodeF = new Node('F');
    	Node* pNodeG = new Node('G');
    	Node* pNodeH = new Node('H');
    
    	pMap->addNode(pNodeA);
    	pMap->addNode(pNodeB);
    	pMap->addNode(pNodeC);
    	pMap->addNode(pNodeD);
    	pMap->addNode(pNodeE);
    	pMap->addNode(pNodeF);
    	pMap->addNode(pNodeG);
    	pMap->addNode(pNodeH);
    
    	pMap->setValueToMatrixForUndirectedGraph(0, 1);
    	pMap->setValueToMatrixForUndirectedGraph(0, 3);
    	pMap->setValueToMatrixForUndirectedGraph(1, 2);
    	pMap->setValueToMatrixForUndirectedGraph(1, 5);
    	pMap->setValueToMatrixForUndirectedGraph(3, 6);
    	pMap->setValueToMatrixForUndirectedGraph(3, 7);
    	pMap->setValueToMatrixForUndirectedGraph(6, 7);
    	pMap->setValueToMatrixForUndirectedGraph(2, 4);
    	pMap->setValueToMatrixForUndirectedGraph(4, 5);
    
    	pMap->printMatrix();
    	cout << endl;
    	pMap->depthFirstTraverse(0);
    	pMap->resetNode();
    	cout << endl;
    	pMap->breadthFirstTraverse(0);
    	return 0;
    }
    
  • 相关阅读:
    资源-python 视频下载大全
    ubuntu 16.04(操作应用) -软件卸载
    资源-简历的相关知识
    centos (命令操作)-crontab命令
    ubuntu 16.04 (软件应用)-输入法
    ntp时间同步
    lvm空间扩容
    目录知识
    Linux下安装maven
    elasticsearch安装pinyin模块
  • 原文地址:https://www.cnblogs.com/chengmf/p/12454594.html
Copyright © 2011-2022 走看看