• 算法-图论-有权图


    稠密图

    #ifndef DENSEGRAPH_H
    #define DENSEGRAPH_H
    #include <iostream>
    #include <vector>
    #include <cassert>
    #include "Edge.h"
    using namespace std;
    
    //稠密图 -- 邻接矩阵 --有权
    template <typename Weight>
    class DenseGraph{
    private:
        int n,m;//点数和边数
        bool directed;//有向图还是无向图
        vector<vector<Edge<Weight>* >> g;//邻接矩阵,两个向量嵌套
    public:
        DenseGraph(int n,bool directed){
            this->n = n;
            this->m = 0;
            this->directed = directed;
            for(int i=0;i<n;i++)
                g.push_back(vector<Edge<Weight>* >(n,NULL));//创建矩阵
        }
        ~DenseGraph(){
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(g[i][j] != NULL)
                        delete g[i][j];
        }
        int V(){return n;}//顶点
        int E(){return m;}//
    
        void addEdge(int v,int w,Weight weight){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
            if (hasEdge(v,w)){
                delete g[v][w];
                if(!directed)
                    delete g[w][v];
                m --;
            }
                
    
            g[v][w] = new Edge<Weight>(v,w,weight);
            if(!directed)
                g[w][v] = new Edge<Weight>(v,w,weight);
            m ++;
        }
        bool hasEdge(int v,int w){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
            return g[v][w] != NULL;
        }
        void show(){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                    if(g[i][j])
                        cout<<g[i][j]->wt() <<"	";
                    else
                        count<<"NULL	";
                cout<<endl;
            }
        }
    
        class adjIterator{
        private:
            DenseGraph &G;
            int v;
            int index;
        public:
            adjIterator(DenseGraph &graph,int v):G(graph){
                this->v = v;
                this->index=-1;
            }
            Edge<Weight>* begin(){
                index = -1;
                return next();
            }
            Edge<Weight>* next(){
                for(index +=1;index <= G.V(); index++)
                    if(G.g[v][index])
                        return G.g[v][index];
                return NULL;
    
            }
            bool end(){
                return index >= G.V();
            }
        };
    
    };
    
    #endif

    稀疏图

    #ifndef SPARSEGRAPH_H
    #define SPARSEGRAPH_H
    #include <iostream>
    #include <vector>
    #include <cassert>
    #include "Edge.h"
    using namespace std;
    
    //稀疏图图 -- 邻接表 --有权
    template<typename Weight>
    class SparseGraph{
    private:
        int n,m;//点数和边数
        bool directed;//有向图还是无向图
        vector<vector<Edge<Weight> *>> g;
    public:
        SparseGraph(int n,bool directed){
            this->n = n;
            this->m = 0;
            this->directed = directed;
            for(int i=0;i<n;i++)
                g.push_back(vector<Edge<Weight> *>());
        }
        ~SparseGraph(){
            for(int i=0;i<n;i++)
                for(int j=0;j<g[i].size();j++)
                    delete g[i][j];
        };
        int V(){return n;}//顶点
        int E(){return m;}//
    
        void addEdge(int v,int w,Weight weight){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
    
            g[v].push_back(new Edge(v,w,weight));
            if(v != w && !directed)//处理自环边
                g[w].push_back(new Edge<Weight>(w,v,weight));
            m++;
        }
        bool hasEdge(int v,int w){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
            for(int i=0;i<g[v].size();i++){
                if(g[v][i]->other(v) == w)
                    return true;
            }
            return false;
        }
        void show(){
            for(int i=0;i<n;i++){
                cout<<"vertex "<<i <<":	";
                for(int j=0;j<g[i].size();j++)
                    cout<<"( to:"<<g[i][j]->w()<<",wt:"<<g[i][j]->wt()<<")	";
                cout<<endl;
            }
        }
    
        //迭代器,迭代顶点的相邻的边
        class adjIterator{
        private:
            SparseGraph &G;
            int v;
            int index;
        public:
            adjIterator(SparseGraph &graph,int v):G(graph){
                this->v = v;
                this->index=0;
            }
            Edge<Weight>* begin(){
                index =0;
                if(G.g[v].size())
                    return G.g[v][index];
                return NULL;
            }
            Edge<Weight>* next(){
                index ++;
                if(index <G.g[v].size())
                    return G.g[v][index];
                return NULL;
            }
            bool end(){
                return index>= G.g[v].size();
    
            }
        };
    
    };
    
    #endif

    Edge.h

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    template<typename Weight>
    class Edge{
    private:
        int a,b; //两个顶点
        Weight weight;//权值
    public:
        Edge(int a,int b,Weight weight){
            this->a =a;
            this->b = b;
            this->weight =weight;
        }
        Edge(){}
    
        ~Edge(){}
    
        int v(){return a;}//获取顶点a
        int w(){return b;}//获取顶点b
        Weight wt(){return weight;}//获取权重
    
        int other(int x){
            assert(x==a || x == b);
            return x == a ? b : a; //返回已知顶点的另一端
        }
        friend ostream& operator<<(ostream &os,const Edge &e){
            os<<e.a<<"-"<<e.b<<": "<<e.weight;
            return os;
        }
        bool operator<(Edge<Weight>& e){
            return weight < e.wt();
        }
        bool operator<=(Edge<Weight>& e){
            return weight <= e.wt();
        }
        bool operator>(Edge<Weight>& e){
            return weight > e.wt();
        }
        bool operator>=(Edge<Weight>& e){
            return weight >= e.wt();
        }
        bool operator==(Edge<Weight>& e){
            return weight == e.wt();
        }
    
    };
    ReadGraph
    #ifndef READGRAPH_H
    #define READGRAPH_H
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <cassert>
    using namespace std;
    
    template <typename Graph,typename Weight>
    class ReadGraph{
    public:
        ReadGraph(Graph &graph,const string &filename){
            ifstream file(filename);
            string line;
            int V,E;
    
            assert(file.is_open());
            assert(getline(file,line))
            stringstream ss(line);
    
            ss>>V>>E;
            assert(V ==graph.V());
            for(int i =0;i<E;i++){
                assert(getline(file,line))
                stringstream ss(line);
                int a,b;
                Weight w;
                ss>>a>>b>>w;
                assert(a >= 0 && a<V);
                assert(b >= 0 && b<V);
                graph.addEdge(a,b,w);
            }
        }
    };
    
    #endif
  • 相关阅读:
    2-7-配置iptables防火墙增加服务器安全
    2-6-搭建无人执守安装服务器
    2-4-搭建FTP服务器实现文件共享
    第一阶段连接
    在mfc中如何显示出系统时间
    关于const
    第三章类图基础
    算法分析的数学基础
    第十二章 派生类
    学好C++该看什么书呢?
  • 原文地址:https://www.cnblogs.com/Erick-L/p/12641057.html
Copyright © 2020-2023  润新知