- 稀疏图(SparseGraph)——邻接表
- 稠密图(DenseGraph)——邻接矩阵
#include<iostream>
#include<assert>
#include<vector>
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(){
}
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 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++;
}
};
#include<iostream>
#include<vector>
#include<assert>
using namespace std;
//稠密图(邻接矩阵)定义
class DenseGraph{
private:
int n,m;
vector<vector<bool>> g; //二位矩阵用来存储点之间的连接关系
bool directed; //有向图/无向图
public:
DenseGraph(int n,bool directed){
this->n=n;
this->m=0; //初始边数默认为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];
}
};