天天看點

圖的鄰接多重表存儲

Triple.h

//用二維數組初始化每條邊的值
template<class T>
class Triple
{
    public:
        int data[][];
        Triple()
        {
        }
        /*Triple(int arr[][],int n)
        {
            for(int i =  ;i < n;i++)
            {
                this->data[i][] = arr[i][];
                this->data[i][] = arr[i][];
                this->data[i][] = arr[i][];
            }
        }*/
        ~Triple()
        {
        }
};
           

Ebox.h

//邊節點
template<class T>
class Ebox
{
    public:
        Ebox()
        {
        }
        int mark;
        int vertex_i;
        int vertex_j;
        int value;
        Ebox *i_link;//指向頂點I有關的下一條邊 
        Ebox *j_link;//指向頂點J有關的下一條邊 
};
           

LinkedMatrix.h

//頂點
#include"Ebox.h"
template<class T>
class LinkedMatrix
{


    public:
        int data;//頂點名稱
        Ebox <T>*First_edge;//指向邊鍊
        LinkedMatrix()
        {
        }
};
           

Adjacency_mul.h

#include"LinkedMatrix.h"
#include"Triple.h"
#define MAX_INT 12345678
template<class T>
class AdjlistGraph
{
    private:
        int n;//定點數
        LinkedMatrix <int> *adjlist;//鄰接表
        int path[][];//記錄兩點最短路徑
        int dist[][];//記錄最短路徑的值
    public:
        AdjlistGraph()
        {
            this->n = ;
        }
        AdjlistGraph(int vertices[],int vertexCount,Triple<int>*edges,int edgeCount)
        {
            int i;
            this->n = vertexCount;
            adjlist = new LinkedMatrix<int>[vertexCount];
        //  adjlist = new LinkedMatrix[this->n];
            for( i = ;i < vertexCount;i++) 
            { 
                adjlist[i].data = vertices[i];
                adjlist[i].First_edge = NULL;
            } 

            for(i = ;i < edgeCount;i++)
            {
                Ebox<T> *p = new Ebox<T>;
                p->vertex_i = edges->data[i][];
                p->vertex_j = edges->data[i][];
                p->value = edges->data[i][];                               //頭插邊節點
                p->i_link = adjlist[p->vertex_i].First_edge;
                p->j_link = adjlist[p->vertex_j].First_edge ;
                adjlist[p->vertex_i].First_edge = adjlist[p->vertex_j].First_edge  = p;
            }


        }
        void Mark_unvisited()
        {
        //标記一條邊是否被通路過
            int i;
            Ebox<T>*p;
            for(i = ;i < this->n;i++)
            {
                p = adjlist[i].First_edge;
                while(p)           //每個節點相鄰的邊都初始化
                {
                    p->mark = ;
                    if(p->vertex_i == i)
                    {
                        p = p->i_link;
                    }
                    else
                        p = p->j_link;
                }
            }
        }

        void Display()
        {
        //輸出邊
            int i;
            Ebox<T>*p;
            Mark_unvisited();
            for(i = ;i < this->n;i++)
            {
                p = adjlist[i].First_edge;
                while(p)
                {
                        if(p->vertex_i == i)
                        {   
                            if(p->mark == )
                            {
                                cout << p->vertex_i << "---" << p->vertex_j << "'s value = " << p->value <<endl;
                                p->mark = ;
                            }
                            p = p->i_link;
                        }
                        else
                        {
                            if(p->mark == )
                            {
                                cout << p->vertex_i << "---" << p->vertex_j << "'s value = " << p->value <<endl;
                                p->mark = ;

                            }
                             p = p->j_link;
                        }


                }
            }
        }