zoukankan      html  css  js  c++  java
  • 算法 -- 图论

     稀疏图

    #ifndef SPARSEGRAPH_H
    #define SPARSEGRAPH_H
    #include <iostream>
    #include <vector>
    #include <cassert>
    using namespace std;
    
    //稀疏图图 -- 邻接表
    class SparseGraph{
    private:
        int n,m;//点数和边数
        bool directed;//有向图还是无向图
        vector<vector<int>> 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<int>());
        }
        ~SparseGraph(){
    
        };
        int V(){return n;}//顶点
        int E(){return m;}//
    
        void addEdge(int v,int w){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
    
            g[v].push_back(w);
            if(v != w && !directed)//处理自环边
                g[w].push_back(v);
            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] == 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<<g[i][j]<<"	";
                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;
            }
            int begin(){
                index =0;
                if(G.g[v].size())
                    return G.g[v][index];
                return -1;
            }
            int next(){
                index ++;
                if(index <G.g[v].size())
                    return G.g[v][index];
                return -1;
            }
            bool end(){
                return index>= G.g[v].size();
    
            }
        };
    
    };
    
    #endif

    稠密图

    #ifndef DENSEGRAPH_H
    #define DENSEGRAPH_H
    #include <iostream>
    #include <vector>
    #include <cassert>
    using namespace std;
    
    //稠密图 -- 邻接矩阵
    class DenseGraph{
    private:
        int n,m;//点数和边数
        bool directed;//有向图还是无向图
        vector<vector<bool>> 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<bool>(n,false));//创建矩阵
        }
        ~DenseGraph(){
        }
        int V(){return n;}//顶点
        int E(){return m;}//
    
        void addEdge(int v,int w){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
            if (hasEdge(v,w))
                return;
    
            g[v][w] = true;
            if(!directed)
                g[w][v] = true;
            m ++;
        }
        bool hasEdge(int v,int w){
            assert(v>=0 && v<n);
            assert(w>=0 && w<n);
            return g[v][w];
        }
        void show(){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                    cout<<g[i][j]<<"	";
                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;
            }
            int begin(){
                index = -1;
                return next();
            }
            int next(){
                for(index +=1;index <= G.V(); index++)
                    if(G.g[v][index])
                        return index;
                return -1;
    
            }
            bool end(){
                return index >= G.V();
            }
        };
    
    };
    
    #endif

    图文件读取模板

    #ifndef READGRAPH_H
    #define READGRAPH_H
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <cassert>
    using namespace std;
    
    template <typename Graph>
    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;
                ss>>a>>b;
                assert(a >= 0 && a<V);
                assert(b >= 0 && b<V);
                graph.addEdge(a,b);
            }
        }
    };
    
    #endif
  • 相关阅读:
    BlockingQueue(阻塞队列)详解
    支付宝系统架构(内部架构图)
    微博的消息队列
    JVM源码分析之堆外内存完全解读
    滑动冲突的补充——Event的流程走向
    BaseFragment的定义—所有Fragment的父类
    BaseActivity的定义——作为所有Activity类的父类
    BGARefreshLayout-Android-master的简单使用
    分析BGARefreshLayout-master
    简便数据库——ORMLite框架
  • 原文地址:https://www.cnblogs.com/Erick-L/p/12619069.html
Copyright © 2011-2022 走看看