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;
    }
    
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/chengmf/p/12454594.html
Copyright © 2011-2022 走看看