【数据结构】图
图的概念 5. 权:边附带的数据信息 8. 连通图与强连通图 图的存储邻接矩阵 我们将用一个数组表示顶点的集合,利用矩阵表示顶点间的关系。 #include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
template <class V,class W,bool IsDirect = false>//false表示为无向图
class Graph
{
public:
Graph(const V* arr,size_t size)
: _v(arr,arr + size)
{
_edges.resize(size);
for (size_t i = 0; i < size; i++)
_edges[i].resize(size);
}
int GetIndex(const V& v)
{
for (size_t i = 0; i < _v.size(); i++)
{
if (_v[i] == v)
return i;
}
assert(false);
return -1;
}
void AddEdges(const V v1,const V v2,const W& weight)//存储边
{
size_t index1 = GetIndex(v1);
size_t index2 = GetIndex(v2);
_edges[index1][index2] = weight;
if (!IsDirect)//无向图需要两次,有向图只需要一次 false为无向图
_edges[index2][index1] = weight;
}
void Print()//打印矩阵
{
for (size_t i = 0; i < _v.size(); i++)
{
printf("%c ",_v[i]);
for (size_t j = 0; j < _v.size(); j++)
{
printf("%2d ",_edges[i][j]);
}
cout << endl;
}
}
size_t Dev(const V& v)//计算顶点的度
{
size_t index = GetIndex(v);
size_t count = 0;//false表示无向图,无向图度的计算是遍历一行,
//true是有向图,有向图度的计算:出度+入度
for (size_t i = 0; i < _v.size(); i++)
{
if (_edges[index][i] > 0)
count++;
if (IsDirect && _edges[i][index] > 0)
count++;
}
return count;
}
private:
vector<V> _v;
vector<vector<W>> _edges;
};
对于带权的图,我们可以将1改成权值;如果没有某条边,可以把0改成无穷大;对角线上自己到自己的边,仍然存为0。 邻接表 利用数组表示顶点的集合,利用好链表表示边的关系。把顶点在数组中的下标存放到链表的数据域中。 #include <vector>
#include <iostream>
using namespace std;
template <class W>
struct Node
{
Node(const W& weight,size_t src,size_t dst)
: _weight(weight),_src(src),_dst(dst),_pNext(NULL)
{}
W _weight;
size_t _src;
size_t _dst;
Node* _pNext;
};
template <class V,bool IsDirect = false>//无向图为false;有向图为true
class Graph
{
typedef Node<W> Node;
typedef Node* pNode;
public:
Graph(const V* arr,arr + size)
{
_linkEdges.resize(size);
}
int GetIndex(const V& v)
{
for (size_t i = 0; i < _v.size(); i++)
{
if (_v[i] == v)
return i;
}
return -1;
}
void AddEdges(const V& v1,const V& v2,const W& weight)
{
size_t srcIndex = GetIndex(v1);
size_t dstIndex = GetIndex(v2);
_Add(srcIndex,dstIndex,weight);
if (!IsDirect)//false 无向图
_Add(dstIndex,srcIndex,weight);
}
size_t Dev(const V& v)
{
size_t count = 0;
size_t index = GetIndex(v);
pNode pCur = _linkEdges[index];
while (pCur)//如果是无向图,直接计算度,如果是有向图先计算出度
{
count++;
pCur = pCur->_pNext;
}
if (IsDirect)
{
for (size_t i = 0; i < _v.size(); i++)//计算有向图的入度
{
if (i != index)
{
pCur = _linkEdges[i];
while (pCur)
{
if (pCur->_dst == index)
count++;
pCur = pCur->_pNext;
}
}
}
}
return count;
}
private:
void _Add(const size_t src,const size_t dst,const W& weight)
{
pNode pNew = new Node(weight,src,dst);
pNode pCur = _linkEdges[src];
pNew->_pNext = _linkEdges[src];
_linkEdges[src] = pNew;
}
private:
vector<V> _v;
vector<pNode> _linkEdges;
}; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |