#include<iostream>
using namespace std;
#define MAXSIZE 5
#define Infinity 100
#include<vector>
#include<utility>
/*
邻接矩阵的空间复杂度为O(n) ;
适合存贮稠密图,如果边很少的话会造成很大的空间浪费
*/
//不带权值,只用0和1表示是否存在连接的边
struct mgraph1 {
char value[MAXSIZE]; //存储当前的节点
bool edge[MAXSIZE][MAXSIZE]; //存储节点的边
int var_num,side_num; //当前的顶点数和当前边的数量
//无参构造
mgraph1() {
fill(value, value + MAXSIZE, ' ');
memset(edge,false,sizeof(edge));
var_num = 0;
side_num = 0;
}
//有参构造,由value和矩阵下标构造
mgraph1(const string &values,const vector<pair<int,int>> &edgs) {
fill(value,value+MAXSIZE,' ');
var_num = values.size();
if (values.size()<=MAXSIZE) {
for (int i = 0; i < values.size();i++) {
value[i] = values[i];
}
}
memset(edge,false,sizeof(edge));
for (auto &e: edgs) {
edge[e.first][e.second] = true;
edge[e.second][e.first] = true;
side_num++;
}
}
//有参构造,由value和端点的值构造
mgraph1(const string &values,const vector<pair<char,char>> &edgs) {
fill(value,value+MAXSIZE,' ');
var_num = values.size();
if (values.size() <= MAXSIZE) {
for (int i = 0; i < values.size();i++) {
value[i] = values[i];
}
}
memset(edge,false,sizeof(edge));
for (auto& e : edgs) {
for (int i=0; i < values.size(); i++) {
if (e.first == values[i]) {
for (int j = 0; j < values.size(); j++) {
if (e.second == values[j]) {
edge[i][j] = true;
edge[j][i] = true;
break;
}
}
break;
}
}
}
side_num = edgs.size();
}
/*
找节点对应的下标
*/
int findindex(const char value) {
for (int i = 0; i < this->var_num;i++) {
if (this->value[i] == value) {
return i;
}
else {
return -1;
}
}
}
/*
判断图是否存在连线AB
*/
bool adjacent(const string &node) {
if (node.size() == 2) {
int i = this->findindex(node[0]);
int j = this->findindex(node[1]);
if (i == -1 || j == -1) {
return false;
}
else if (this->edge[i][j]==true) {
return true;
}
}
else {
return false;
}
}
/*
在图中插入新的边
*/
bool insertEdge(const string &es) {
if (es.size() == 2) {
int i = this->findindex(es[0]);
int j = this->findindex(es[1]);
if (i == -1 || j == -1) {
return false;
}
else{
this->edge[i][j] = true;
this->edge[i][j] = true;
return true;
}
}
else {
return false;
}
}
/*
删除边AB
*/
bool delEdge(const string &es) {
if (es.size() == 2) {
int i = this->findindex(es[0]);
int j = this->findindex(es[1]);
if (this->edge[i][j]==false) {
cout << "这条边不存在" << endl;
return false;
}
else {
this->edge[i][j] = false;
return true;
}
}
else {
return false;
}
}
};
/*
遍历邻接矩阵
0 1 1 1 1
1 0 1 1 0
1 1 0 0 0
1 1 0 0 0
1 0 0 0 0
*/
void Byorder(mgraph1 &m1) {
if (m1.var_num != 0) {
for (int i = 0; i < m1.var_num;i++) {
for (int j = 0; j < m1.var_num; j++) {
if (m1.edge[i][j]) {
cout << m1.value[i] << "---" << m1.value[j] << endl;
}
}
}
}
}
int main() {
//不带权值
mgraph1 m1 ;
vector<pair<int, int>> edges{
{ 0,1 }, { 0,2 }, { 0,3 }, { 0,4 },
{ 1,0 }, { 1,2 }, { 1,3 },
{ 2,0 }, { 2,1 },
{ 3,0 }, { 3,1 },
{ 4,0 }
};
mgraph1 m2("ABCDE",edges);
Byorder(m2);
cout << endl;
vector<pair<char, char>> e2{
{'A', 'B'}, { 'A', 'C' }, { 'A', 'D' }, { 'A', 'E' },
{ 'B', 'C' }, { 'B', 'D' }
};
mgraph1 m3("ABCDE",e2);
Byorder(m3);
//
//
}
c++实现邻接矩阵(不带权值)的存储
于 2023-06-14 20:46:24 首次发布