AdjacencyMatrix
This commit is contained in:
		
							
								
								
									
										157
									
								
								Graph/adjacencyMatrix/adjacencyMatrix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								Graph/adjacencyMatrix/adjacencyMatrix.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
/*
 | 
			
		||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ涨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫͨ<EFBFBD><EFBFBD>(_v - 1)<29>ķ<EFBFBD>ʽ<EFBFBD>Ľ<DEB8><C4BD><EFBFBD>matrix<69>ķ<EFBFBD>ʽ
 | 
			
		||||
*/
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include "graph.h"
 | 
			
		||||
#include "vertexIterator.h"
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <vector>
 | 
			
		||||
template <class T>
 | 
			
		||||
class adjacencyMatrix : public Graph<T> {
 | 
			
		||||
private:
 | 
			
		||||
	int v;
 | 
			
		||||
	int e;
 | 
			
		||||
	std::vector<std::vector<T>> matrix;
 | 
			
		||||
    std::vector<bool> reach;
 | 
			
		||||
    static constexpr T INF = std::numeric_limits<T>::infinity(); // <20>dz<EFBFBD><C7B3><EFBFBD>Ҫ:-| <20>ޱ<EFBFBD>ʱ<EFBFBD><CAB1>ֵ
 | 
			
		||||
    //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>static const<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ⶨ<EFBFBD><E2B6A8>
 | 
			
		||||
 | 
			
		||||
	//<2F><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>iterator<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD>
 | 
			
		||||
    class VertexIteratorImpl : public vertexIterator<T> {
 | 
			
		||||
    private:
 | 
			
		||||
        const std::vector<T>& neighbors; // <20><>ǰ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
 | 
			
		||||
        int current; // <20><>ǰ<EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        int n; // <20><><EFBFBD><EFBFBD>ά<EFBFBD><CEAC>
 | 
			
		||||
        const T INF; // <20>ޱ߱<DEB1><DFB1><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
        VertexIteratorImpl(const std::vector<T>& row, int size, T inf)
 | 
			
		||||
            : neighbors(row), current(0), n(size), INF(inf) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int next() override {
 | 
			
		||||
            while (current < n && neighbors[current] == INF) {
 | 
			
		||||
                ++current;
 | 
			
		||||
            }
 | 
			
		||||
            if (current < n) {
 | 
			
		||||
                return current++;
 | 
			
		||||
            }
 | 
			
		||||
            return -1; // û<>и<EFBFBD><D0B8><EFBFBD><EFBFBD>ھ<EFBFBD>
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool hasNext() const override {
 | 
			
		||||
            int temp = current;
 | 
			
		||||
            while (temp < n && neighbors[temp] == INF) {
 | 
			
		||||
                ++temp;
 | 
			
		||||
            }
 | 
			
		||||
            return temp < n;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    adjacencyMatrix(int _v): v(_v), e(0) {
 | 
			
		||||
        //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        matrix.assign(_v, std::vector<T>(_v, INF));
 | 
			
		||||
        reach.assign(_v, false);
 | 
			
		||||
    }
 | 
			
		||||
    ~adjacencyMatrix() override {}
 | 
			
		||||
    bool validateV(int _v) const {
 | 
			
		||||
        return _v >= 0 && _v < v;
 | 
			
		||||
    }
 | 
			
		||||
    int numberOfVertices() const override { return v; }
 | 
			
		||||
    int numberOfEdges() const override { return e; }
 | 
			
		||||
    bool existsEdge(int _a, int _b) const override {
 | 
			
		||||
        //<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ָa->b
 | 
			
		||||
        if (!validateV(_a) || !validateV(_b)) return false;
 | 
			
		||||
        return matrix[_a][_b] != INF;
 | 
			
		||||
    }
 | 
			
		||||
    void insertEdge(edge<T>* _e) override {
 | 
			
		||||
        if (!_e) return;
 | 
			
		||||
        if (!validateV(_e->from) || !validateV(_e->to)) return;
 | 
			
		||||
        matrix[_e->from][_e->to] = _e->weight;
 | 
			
		||||
        e++;
 | 
			
		||||
    }
 | 
			
		||||
    void eraseEdge(int _a, int _b){
 | 
			
		||||
        if (!validateV(_a) || !validateV(_b)) return;
 | 
			
		||||
        matrix[_a][_b] = INF;
 | 
			
		||||
        e--;
 | 
			
		||||
    }
 | 
			
		||||
    //<2F><>ע<EFBFBD><D7A2>
 | 
			
		||||
    int degree(int _v) const override {
 | 
			
		||||
        return inDegree(_v) + outDegree(_v);
 | 
			
		||||
    }
 | 
			
		||||
    int inDegree(int _v) const override {
 | 
			
		||||
        int js = 0;
 | 
			
		||||
        for (int i = 0;i < v; i++) {
 | 
			
		||||
            if (matrix[i][_v] != INF) js++;
 | 
			
		||||
        }
 | 
			
		||||
        return js;
 | 
			
		||||
    }
 | 
			
		||||
    int outDegree(int _v) const {
 | 
			
		||||
        int js = 0;
 | 
			
		||||
        for (auto x : matrix[_v]) {
 | 
			
		||||
            if (x != INF) js++;
 | 
			
		||||
        }
 | 
			
		||||
        return js;
 | 
			
		||||
    }
 | 
			
		||||
    // <20><><EFBFBD>ؽڵ<D8BD>u<EFBFBD><75><EFBFBD>ھӵ<DABE><D3B5><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    vertexIterator<T>* iterator(int _v) override {
 | 
			
		||||
        validateV(_v);
 | 
			
		||||
        return new VertexIteratorImpl(matrix[_v], v, INF);
 | 
			
		||||
    }
 | 
			
		||||
    // <20>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͼ
 | 
			
		||||
    bool directed() const override {
 | 
			
		||||
        return true; // <20><><EFBFBD><EFBFBD>ͼ
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // <20>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>Ȩͼ
 | 
			
		||||
    bool weighted() const override {
 | 
			
		||||
        return true; // <20><>Ȩͼ
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void bfs(int _v);
 | 
			
		||||
    void dfs(int _v);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline void adjacencyMatrix<T>::bfs(int _v)
 | 
			
		||||
{
 | 
			
		||||
    std::deque<int> arr;
 | 
			
		||||
    arr.push_back(_v);
 | 
			
		||||
    std::vector<bool> visited;
 | 
			
		||||
    visited.assign(v, false);
 | 
			
		||||
    visited[_v] = true;
 | 
			
		||||
 | 
			
		||||
    while (!arr.empty()) {
 | 
			
		||||
        int u = arr.front();
 | 
			
		||||
        std::cout << u << " ";
 | 
			
		||||
        arr.pop_front();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < v; i++) {
 | 
			
		||||
            if (matrix[u][i] != INF && !visited[i]) {
 | 
			
		||||
                arr.push_back(i);
 | 
			
		||||
                visited[i] = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    std::cout << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline void adjacencyMatrix<T>::dfs(int _v)
 | 
			
		||||
{
 | 
			
		||||
    if (!validateV(_v)) return;
 | 
			
		||||
    if (reach.at(_v) == true) return;
 | 
			
		||||
    reach.at(_v) = true;
 | 
			
		||||
 | 
			
		||||
    std::cout << _v << " ";
 | 
			
		||||
    for (int i = 0; i < v; i++) {
 | 
			
		||||
        if (matrix[_v][i] != INF && reach.at(i) == false) {
 | 
			
		||||
            dfs(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::cout << _v << " ";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								Graph/adjacencyMatrix/graph.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Graph/adjacencyMatrix/graph.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "vertexIterator.h"
 | 
			
		||||
template <class T>
 | 
			
		||||
struct edge {
 | 
			
		||||
	int from, to;
 | 
			
		||||
	T weight;
 | 
			
		||||
 | 
			
		||||
	edge(int _from, int _to, T _weight) : from(_from), to(_to), weight(_weight) {}
 | 
			
		||||
};
 | 
			
		||||
template <class T>
 | 
			
		||||
class Graph {
 | 
			
		||||
public:
 | 
			
		||||
	virtual ~Graph() {}
 | 
			
		||||
 | 
			
		||||
	//ADT Methods
 | 
			
		||||
	virtual int numberOfVertices() const = 0;
 | 
			
		||||
	virtual int numberOfEdges() const = 0;
 | 
			
		||||
	virtual bool existsEdge(int, int) const = 0;
 | 
			
		||||
	virtual void insertEdge(edge<T>*) = 0;
 | 
			
		||||
	virtual int degree(int) const = 0;
 | 
			
		||||
	virtual int inDegree(int) const = 0;
 | 
			
		||||
 | 
			
		||||
	//Other Methods
 | 
			
		||||
	virtual bool directed() const = 0;	//<2F><><EFBFBD><EFBFBD>ͼ
 | 
			
		||||
	virtual bool weighted() const = 0;	//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩͼ
 | 
			
		||||
	virtual vertexIterator<T>* iterator(int) = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										14
									
								
								Graph/adjacencyMatrix/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Graph/adjacencyMatrix/main.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
#include "adjacencyMatrix.h"
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main() {
 | 
			
		||||
	adjacencyMatrix<double> g(11);
 | 
			
		||||
	edge<double> e1(1, 2, 0.5), e2(1, 3, 0.6), e3(1, 4, 0.7) , e4(1, 5, 0.8), e5(3, 10, 0.9);
 | 
			
		||||
	edge<double> e6(10, 7, 0.5), e7(2, 5, 0.6), e8(5, 8, 0.7);
 | 
			
		||||
	g.insertEdge(&e1);g.insertEdge(&e2);g.insertEdge(&e3);g.insertEdge(&e4);g.insertEdge(&e5);g.insertEdge(&e6);g.insertEdge(&e7);g.insertEdge(&e8);
 | 
			
		||||
	cout << g.degree(1) << endl;
 | 
			
		||||
	cout << g.inDegree(5) << endl;
 | 
			
		||||
	cout << g.outDegree(8) << endl;
 | 
			
		||||
	g.bfs(1);
 | 
			
		||||
	g.dfs(1);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								Graph/adjacencyMatrix/vertexIterator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Graph/adjacencyMatrix/vertexIterator.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
template <class T>
 | 
			
		||||
class vertexIterator {
 | 
			
		||||
public:
 | 
			
		||||
    virtual ~vertexIterator() {}
 | 
			
		||||
    virtual int next() = 0;
 | 
			
		||||
    virtual bool hasNext() const = 0;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user