body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

/* Graph.h */
#ifndef __GRAPH_H__
#define __GRAPH_H__
#include<iostream>
#include<string>
#include<fstream>
#define value_type char   //图顶点的数据类型
#define weight_vaule_type int
#define max_weight_value_type 0x7FFFFFFF   //默认int类型是signed int
//图中邻接矩阵都是动态申请空间
using namespace std;
namespace meihao
{
        static bool graph_error = false;
        class Graph
        {
        public:
                Graph(const string& fileName):_vertexNum(0)
                        ,_vertex(nullptr)
                        ,_arc(nullptr)
                {
                        readGraphFromFile(fileName);
                }
                ~Graph();
                void printVertexMatrix()const;
                void printGraphEdgeMatrix()const;
                int getGraphVertexNumber()const;
                weight_vaule_type getGraphEdgeWeight(int vi,int vj)const;
                value_type getGraphVertexData(int vi)const;  //获取第vi个顶点的值
                int setGraphEdgeWeight(int vi,int vj,int weight);  //修改边的权值
                int getOutDegree(int vi)const;  //获取某一个顶点的出度
                int getInputDegree(int vi)const;  //获取某一个顶点的入度
        protected:
                void readGraphFromFile(const string& fileName);
                void writeGraphFromFile(const string& fileName);
        private:
                int _vertexNum;  //图的顶点数
                value_type* _vertex;   //顶点数组
                weight_vaule_type** _arc;      //邻接矩阵,边数组
        };
};
#endif

/* mainfunc.cpp */
#include"Graph.h"
int main()
{
        meihao::Graph g("data.txt");
        cout<<"图顶点数:"<<g.getGraphVertexNumber()<<endl;
        cout<<"图顶点矩阵:"<<endl;
        g.printVertexMatrix();
        g.printGraphEdgeMatrix();
        cout<<"点A的入度:"<<g.getInputDegree(0)<<endl;
        cout<<"点A的出度:"<<g.getOutDegree(0)<<endl;
        cout<<"(A,C)="<<g.getGraphEdgeWeight(1,2)<<endl;
        cout<<"set <C,D> =5"<<endl;
        g.setGraphEdgeWeight(2,3,5);
        cout<<"(C,D) ="<<g.getGraphEdgeWeight(2,3)<<endl;
        system("pause");
}

/* data.txt */
4
A B C D
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0

运行结果:

//文件目录结构
/* Graph.cpp */
#include"Graph.h"
namespace meihao
{
        void Graph::readGraphFromFile(const string& filename)
        {
                ifstream ifs(filename.c_str(),ios::in|ios::out);  //打开文件,可读可写
                if(ifs.bad())
                {
                        cout<<"read file data init Graph failure!"<<endl;
                        return ;
                }
                ifs>>_vertexNum;
                _vertex = new value_type[_vertexNum]();
                for(int idx=0;idx!=_vertexNum;++idx)  //初始化顶点数组
                        ifs>>_vertex[idx];
                //动态开辟二维数组的内存空间
                _arc = new weight_vaule_type*[_vertexNum]();
                for(int idx=0;idx!=_vertexNum;++idx)
                {
                        _arc[idx] = new weight_vaule_type[_vertexNum]();
                }
                //初始化边数组,邻接矩阵
                for(int idx=0;idx!=_vertexNum;++idx) 
                {
                        for(int iidx=0;iidx!=_vertexNum;++iidx)
                        {
                                ifs>>_arc[idx][iidx];
                        }
                }
                ifs.close();
        }
        void Graph::writeGraphFromFile(const string& fileName)
        {
                ofstream ofs(fileName.c_str(),ios::out);
                if(ofs.bad())
                {
                        cout<<"write file Graph failure!"<<endl;
                        return ;
                }
                //写顶点数
                ofs<<_vertexNum<<endl;
                //写顶点数组
                for(int idx=0;idx!=_vertexNum;++idx)
                {
                        ofs<<_vertex[idx]<<" ";
                }
                ofs<<endl;
                //写邻接矩阵
                for(int idx=0;idx!=_vertexNum;++idx)
                {
                        for(int iidx=0;iidx!=_vertexNum;++iidx)
                        {
                                ofs<<_arc[idx][iidx]<<" ";
                        }
                        ofs<<endl;
                }
                ofs<<endl;
        }
        void Graph::printVertexMatrix()const
        {
                for(int idx=0;idx!=_vertexNum;++idx)
                {
                        cout<<_vertex[idx]<<" ";
                }
                cout<<endl;
        }
        void Graph::printGraphEdgeMatrix()const
        {
                for(int idx=0;idx!=_vertexNum;++idx)
                {
                        for(int iidx=0;iidx!=_vertexNum;++iidx)
                        {
                                cout<<_arc[idx][iidx]<<" ";
                        }
                        cout<<endl;
                }
                cout<<endl;
        }
        int Graph::getGraphVertexNumber()const
        {
                return _vertexNum;
        }
        value_type Graph::getGraphVertexData(int vi)const
        {
                return _vertex[vi];
        }

        weight_vaule_type Graph::getGraphEdgeWeight(int vi,int vj)const
        {
                if(vi<0||vj<0||vi==vj||vi>=_vertexNum||vi>=_vertexNum)
                {
                        graph_error = true;
                        return -1;   //因为图的权值可以是负数,为了区分,就拿一个bool变量来标记什么情况下-1表示出错了
                }
                return _arc[vi][vj];
        }
        int Graph::setGraphEdgeWeight(int vi,int vj,weight_vaule_type weight)
        {
                if(vi<0||vj<0||vi==vj||vi>=_vertexNum||vi>=_vertexNum||weight>max_weight_value_type)
                {
                        graph_error = true;
                        return -1;  
                }
                _arc[vi][vj] = weight;
                writeGraphFromFile("data.txt");
        }
        int Graph::getOutDegree(int vi)const
        {
                if(vi<0||vi>=_vertexNum)
                {
                        graph_error = true;
                        return -1;
                }
                int OD = 0;
                for(int idx=0;idx!=_vertexNum;++idx)
                        OD += _arc[vi][idx];
                return OD;
        }
        int Graph::getInputDegree(int vi)const
        {
                if(vi<0||vi>=_vertexNum)
                {
                        graph_error = true;
                        return -1;
                }
                int ID = 0;
                for(int idx=0;idx!=_vertexNum;++idx)
                        ID += _arc[idx][vi];
                return ID;
        }
        Graph::~Graph()
        {
                if(nullptr!=_vertex)
                {
                        delete []_vertex;
                        _vertex = nullptr;
                }       
                if(nullptr!=_arc)
                {
                        for(int idx=0;idx!=_vertexNum;++idx)
                                delete []_arc[idx];
                        delete []_arc;
                        _arc = nullptr;
                }       
        }
};

图的邻接矩阵存储实现,C++描述的更多相关文章

  1. _DataStructure_C_Impl:图的邻接矩阵存储

    //_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  2. java 图的邻接矩阵

    有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...

  3. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

  4. 数据结构C++实现邻接矩阵存储图

    定义邻接矩阵存储的图类.[实验要求] 1. 创建一个邻接矩阵存储的图: 2. 返回图中指定边的权值: 3. 查找图中某顶点的第一个邻接顶点.某顶点关于另一个顶点的下一个邻接顶点序号: 4. 图的深度优 ...

  5. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  6. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  7. Java图的邻接矩阵实现

    /** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...

  8. E1_1 用邻接矩阵存储有向图,并输出各顶点的出度和入度

    参考书:图论算法理论.实现及应用(北京大学出版社) 输入数据:(test.txt) 程序: /* 邻接矩阵存储有向图 */ #include <cstring> #include < ...

  9. 图的邻接矩阵实现(c)

    参考:算法:c语言实现 一书 图的邻接矩阵实现 #ifndef GRAPH #define GRAPH /* 图的邻接矩阵实现 */ #include<stdio.h> #include& ...

随机推荐

  1. js数组,字符串,json互相转换函数有哪些

    js数组,字符串,json互相转换函数有哪些 一.总结 一句话总结: JSON.stringify(arr) JSON.parse(jsonString) str.split('') array.jo ...

  2. C语言逗号运算符和逗号表达式基础总结

    逗号运算符的作用: 1,起分隔符的作用: 定义变量用于分隔变量:int a,b输入或输出时用于分隔输出表列 printf("%d%d",a,b) 2,用于逗号表达式的顺序运算符 语 ...

  3. 机器学习基石(台湾大学 林轩田),Lecture 2: Learning to Answer Yes/No

    上一节我们跟大家介绍了一个具体的机器学习的问题,以及它的内容的设定,我们今天要继续下去做什么呢?我们今天要教大家说到底我们怎么样可以有一个机器学习的演算法来解决我们上一次提到的,判断银行要不要给顾客信 ...

  4. 小程序for循环嵌套

    <view class='nocontnt' wx:if="{{listLength == 0 }}"> 暂无相关评论 </view> <view c ...

  5. pytorch学习记录

    1.pytorch中的torch.split只能将tensor分割为相等的几分,如果需要特定的需求将tensor分割开,可以用torch.index_select.使用的时候,先生成index索引,示 ...

  6. thinkphp5.0写的项目放到服务器上 lnmp 404

    tp5在Nginx上不适用pathinfo格式的url,在项目的Nginx配置文件里找到include enable-php.conf 改为 include enable-php-pathinfo.c ...

  7. 『TensorFlow』第九弹_图像预处理_不爱红妆爱武装

    部分代码单独测试: 这里实践了图像大小调整的代码,值得注意的是格式问题: 输入输出图像时一定要使用uint8编码, 但是数据处理过程中TF会自动把编码方式调整为float32,所以输入时没问题,输出时 ...

  8. 伪分布式&&完全分布式&&高可用(zookeeper)的配置文件内容

    [伪分布式] ①[core-site.xml] <configuration> <property> <name>fs.defaultFS</name> ...

  9. Ping 的TTL理解

    http://www.webkaka.com/tutorial/zhanzhang/2017/061570/ 根据自己的扩展重新整理了一下,虽然不是运维,想了解一点东西就希望了解清楚. 一.含义 “T ...

  10. body当中的属性

    1. text ——文本颜色 <body text="green"> </body> 2. link ——超链接的颜色                   ...