图的 PPT 代码
图的数据类型
class Graph
{
public:
Graph();
void InsertVertex(T &vertex);
void removeVertex(int v);
void InsertEdge(int v1, int v2, int weight);
void removeEdge(int v1, int v2, int weight);
bool IsEmpty();
T getWeight(int v1, int v2);
int getFirstNeighbor(int v, int w);
int NumberOfVertices();
int NumberOfEdges();
}
图的模板基类
template<class T, class E>
class Graph
{
private:
T *VerticesList; /*顶点表*/
E **Edge; /*邻接矩阵*/
int maxVertices;
int numVertices;
int numEdges;
public:
Graph(int sz); /*构造函数*/
int getVertexPos(T Vertex); /*给出顶点 vertex 在图中的定义*/
T getValue(int i) /*获取顶点 i 的值*/
{
return i >= 0 && i <= numVertices ? VerticesList[i] : NULL;
}
E getWeight(int v1 ,int v2)
{
return v1 != -1 && v2 != -1 ? Edge[v1][v2] : 0;
}
int getFirstNeighbor(int v);
int getNextNeighbor(int v, int w);
void InsertVertex(T &vertex);
void removeVertex(int v);
void InsertEdge(int v1, int v2, int weight);
void removeEdge(int v1, int v2, int weight);
}
int Graph<T, E> :: getVertexPos(T Vertex)
{
for(int i = 0; i < numVertices; i++)
if(VerticesList[i] == Vertex)
return i;
else
return -1;
}
template<class T, class E>
Graph<T, E> :: Graph(int sz)
{
maxVertices = sz;
numVertices = 0;
numEdges = 0;
int i, j;
VerticesList = new T[maxVertices]; /*创建顶点表*/
Edge = (E **)new E*[maxVertices];
for(i = 0; i < maxVertices; i++)
Edge[i] = new E[maxVertices]; /*邻接矩阵*/
for(i = 0; i < maxVertices; i++)
for(j = 0; j < maxVertices; j++)
Edge[i][j] = (i == j) ? 0 : maxWeight; /*矩阵初始化*/
}
template<class T, class E>
int Graph<T, E> :: getFirstNeighbor(int v)
{
if(v != -1)
for(int col = 0; col < numVertices; col++)
if(Edge[v][col] > 0 && Edge[v][col] < maxWeight)
return col;
return -1;
}
template <class T, class E>
int Graph<T, E> :: getNextNeighbor(int v, int w)
{
if(v != -1 && w != -1)
for(int col = w+1; col < numVertices; col++)
if(Edge[v][col] > 0 && Edge[v][col] < maxWeight)
return col;
return -1;
}
用邻接表表示的图的类定义
template <class T, class E>
struct Edge
{
int dest; /*边的另一顶点位置*/
E cost;
Edge<T, E> *link;
Edge();
Edge(int num, E cost):dest(num),weight(cost),link(NULL){}
}
template<class T, class E>
struct Vertex
{
T data; /*顶点的数据*/
Edge<T, E> *adj; /*边链表的头指针*/
};
template <class T, class E>
class Graphlnk
{
private:
Vertex<T, E> *NodeTable; /*顶点表(各边链表的头结点)*/
int maxVertices;
int numVertices;
int numEdges;
public:
Graphlnk(int sz = DefaultVertices);
E getWeight(int v1, int v2);
int getFirstNeighbor(int v);
int getNextNeighbor(int v, int w);
void InsertVertex(T &vertex);
void removeVertex(int v);
void InsertEdge(int v1, int v2, int weight);
void removeEdge(int v1, int v2, int weight);
T getValue(int i)
{
return (i >= 0 && i < numVertices) ? NodeTable[i].data : 0;
}
int getVertexPos(T vertex)
{
for(int i = 0; i < numVertices; i++)
if(NodeTable[i].data == vertex)
return i;
return -1;
}
}
template <class T, class E>
Graphlnk<T, E> :: Graphlnk(int sz)
{
maxVertices = sz;
numVertices = 0;
numEdges = 0;
NodeTable = new Vertex<T,E>[maxVertices]; /*创建顶点表数组*/
for(int i = 0; i < maxVertices; i++)
NodeTable[i].adj = NULL;
}
template <class T, class E>
int Graphlnk<T, E> :: getFirstNeighbor(int v)
{
if(v != -1)
{
Edge<T, E> *p = NodeTable[v].adj;
if(p != NULL)
return p -> dest;
}
return -1;
}
template <class T, class E>
int Graphlnk<T, E> :: getNextNeighboret(int v, int w)
{
if(v != -1)
{
Edge<T, E> *p = NodeTable[v].adj;
while(p != NULL && p -> dest != w)
p = p -> link;
if(p != NULL && p -> link != NULL)
return p -> link -> dest;
}
return -1;
}
图的遍历
template <class T, class E>
void DFS(Graph<T, E> G, int v, bool visited[])
{
cout << G.getValue(v) << '';
visited[v] = true;
int w = G.getFirstNeighbor(v);
while(w != -1)
{
if(!visited[w])
DFS(G, W, visited);
w = G.getNextNeighbor(v,w);
}
}
怎么忘记 BFS了,明天补上…….