图的邻接矩阵存储实现,C++描述
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++描述的更多相关文章
- _DataStructure_C_Impl:图的邻接矩阵存储
//_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- java 图的邻接矩阵
有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 数据结构C++实现邻接矩阵存储图
定义邻接矩阵存储的图类.[实验要求] 1. 创建一个邻接矩阵存储的图: 2. 返回图中指定边的权值: 3. 查找图中某顶点的第一个邻接顶点.某顶点关于另一个顶点的下一个邻接顶点序号: 4. 图的深度优 ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- Java图的邻接矩阵实现
/** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...
- E1_1 用邻接矩阵存储有向图,并输出各顶点的出度和入度
参考书:图论算法理论.实现及应用(北京大学出版社) 输入数据:(test.txt) 程序: /* 邻接矩阵存储有向图 */ #include <cstring> #include < ...
- 图的邻接矩阵实现(c)
参考:算法:c语言实现 一书 图的邻接矩阵实现 #ifndef GRAPH #define GRAPH /* 图的邻接矩阵实现 */ #include<stdio.h> #include& ...
随机推荐
- NGUI实现UITexture的UV滚动
材质上使用的贴图: 效果:实现该纹理在屏幕上的滚动 代码: using System.Collections; using System.Collections.Generic; using Unit ...
- 第 8 章 容器网络 - 049 - 准备 Overlay 网络实验环境
overlay环境准备 在docker-machine (10.12.31.21)的基础上 docker主机 host1 (10.12.31.22) host2 (10.12.31.23) 在dock ...
- sublime Text如何取消两栏窗口?
在菜单栏里的 View->LayOut->Single,也可以用快捷键 Alt+Shift+1.如图所示.(亲测可用) &lt;img src="https:// ...
- 全栈性能测试修炼宝典--Jmeter实战(二)
性能测试初体验 1.测试分类 从图中可以看出,性能测试在整个软件测试环节中占了50%的内容,比如负载测试.压力测试.性能测试.大数据量测试.恢复测试.内容泄露测试.竞品测试(比较测试)和可靠性测试. ...
- 雷林鹏分享:XML 语法规则
XML 语法规则 XML 的语法规则很简单,且很有逻辑.这些规则很容易学习,也很容易使用. 所有的 XML 元素都必须有一个关闭标签 在 HTML 中,某些元素不必有一个关闭标签: This is a ...
- 差异基因分析:fold change(差异倍数), P-value(差异的显著性)
在做基因表达分析时必然会要做差异分析(DE) DE的方法主要有两种: Fold change t-test fold change的意思是样本质检表达量的差异倍数,log2 fold change的意 ...
- 框架设计——View
[demo]: ZZSZYFP : UserControl, INavigateMdiControl(1)继承自UserControl,并实现了 INavigateMdiControl接口(2)限制表 ...
- LeetCode--437--路径总和3
问题描述: 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). 二 ...
- 分离vue组件内部css
当我们使用vue组件的时候,使用webpack打包的时候,默认会把vue组件内部的css打包到页面上,但是打包到页面上很丑陋,所以我们希望可以把vue组件内部的css抽离到css文件中,使用vue-s ...
- win10系统同时安装python2和python3
1.官网下载python2和python3版本 2.安装python3,勾上Add Python3.5 to PATH,自定义选择安装目录,安装,验证:WIN+R--->cmd,输入python ...