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;
    }
    
  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/chengmf/p/12454594.html
Copyright © 2011-2022 走看看