图_Graph

图的 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了,明天补上…….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值