图与其基本算法的实现--用邻接表来存储

图主要用的数据结构是邻接表,
邻接表适用于稀疏图中,比较节省空间,如果在稀疏图中采用邻接矩阵的存储方式,容易造成空间上的浪费。



但邻接表中的边点用的是vector实现的,没有采取链式的结构(感觉这样写简单些,手动滑稽)。
主要实现了有向图的存储,而无向图只要在加边的时候把单向的边改成双向的即可。
例如:加入1-2这条无向边,只需要加一次1-2和一次2-1就可以了。
实现的功能主要有:
邻接表的创建,深度优先搜索(递归dfs和非递归dfs),广度优先搜索(bfs),以及求点的出度的入度
//
//  main.cpp
//  图
//
//  Created by Mr chen on 2019/3/15.
//  Copyright © 2019 Mr chen. All rights reserved.
//

/*
    stl版
    利用现有stack和queue实现的
    图采取的数据结构:邻接表
    邻接表用vector来实现
    有向图
    最大点数为107
    点下标输入默认从零开始,处理数据按从0开始
*/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

const int maxn = 1e2+7;
using namespace std;

typedef char vertextype;    //定义顶点的存储类型
typedef int arctype;    //定义边的权值类型

struct ANode  //边表节点
{
    int id; //邻接点域,存储该顶点对应的下标
    arctype wigth;  //用于存储权值
};

struct VNode   //顶点表节点
{
    int id;
    string data;    //存储顶点数据的信息
    vector q;    //每个点与之相邻接的点与权值
};

class Graph
{
private:
    int sum=0;//统计点访问次数
    VNode VNodeList[maxn];//顶点表节点,存放每个点信息
    bool vis[maxn];
    int in[maxn],out[maxn];
public:
    int pointnum,eagenum;//点数,边数
    Graph(int n,int m);
    void initdfs();
    void initdegree();
    void rec_dfs(int begin);
    void nonrec_dfs(int begin);
    void bfs(int begin);
    int is_connected();
    int get_degree();
    //TODO:(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信息“无x”;
    void print_degree();
    void print();
};

Graph::Graph(int n,int m)//构造函数,输入
{
    this->pointnum=n,this->eagenum=m;
    //printf("请输入%d个点的名字:\n",n);
    for(int i=0;ipointnum;i++)
    {
        //printf("第%d个点的名称为:",i);
        cin>>VNodeList[i].data;
        VNodeList[i].id=i;
    }
    //printf("请输入%d个边的信息,格式:起点编号 终点编号 权值:\n",m);
    int begin,end,wight;
    for(int i=0;ieagenum;i++)
    {
        //printf("第%d条边的信息:",i);
        cin>>begin>>end>>wight;
        VNodeList[begin].q.push_back( {end,wight} );
    }
}

void Graph::initdfs()
{
    sum=0;
    memset(vis, 0, sizeof(vis));
}

void Graph::initdegree()
{
    memset(out,0, sizeof(out));
    memset(in,0, sizeof(in));
}

void Graph::rec_dfs(int n)
{
    cout<=this->pointnum)
        return;
    for(vector::iterator it=VNodeList[n].q.begin();itid])
        {
            rec_dfs(it->id);
        }
    }
}

void Graph::nonrec_dfs(int n)
{
    initdfs();//初始化vis数组
    stack Stack;
    Stack.push(VNodeList[n]);//根节点入栈
    vis[n]=1;
    while(!Stack.empty())
    {
        VNode tmp = Stack.top();
        Stack.pop();
        cout<::iterator it=VNodeList[tmp.id].q.begin();itid])
            {
                Stack.push(VNodeList[it->id]);//未入栈的邻接点入栈
                vis[it->id]=1;
            }
        }
    }
}

void Graph::bfs(int n)
{
    initdfs();
    queue Queue;
    Queue.push(VNodeList[n]);
    while(!Queue.empty())
    {
        VNode tmp = Queue.front();
        Queue.pop();
        cout<::iterator it=VNodeList[tmp.id].q.begin();itid])
            {
                Queue.push(VNodeList[it->id]);//未入队列的邻接点入队列
                vis[it->id]=1;
            }
        }
    }
}

int Graph::is_connected()
{
    initdfs();
    int ans = 0;
    for(int i=0;i::iterator it=VNodeList[i].q.begin();itid]++;
        }
    }
    return 0;
}

void Graph::print_degree()
{
    printf("名称 出度 入度:\n");
    for(int i=0;i::iterator it=VNodeList[i].q.begin();itid<<" "<wigth<<"   ";
        }
        cout<>n>>m)
    {
        Graph mmp(n,m);
        mmp.print();
        int x;
        cin>>x;
        mmp.initdfs();
        mmp.rec_dfs(x);
        cout<<"rec_dfs end"< 
 

你可能感兴趣的:(C/C++)