数据结构与算法-图的遍历

#include<iostream>
#include<string>
#include<queue>
using namespace std;
#define ERROR 1
#define MAX_VERTEX_NUM 100
typedef struct ArcNode{
    int adjvex;
    struct ArcNode *nextarc;
    string info;
}ArcNode;
typedef struct VNode{
    char date;
    ArcNode * firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
    AdjList vertices;
    int vexnum,arcnum;        //当前图的vexnum顶点数和arcnum弧数
    int kind;
}ALGraph;
int LocateVex(ALGraph &G,char &v1)
{
    int i;
    for(i=0;i<G.vexnum;i++)
    {
        if(G.vertices[i].date==v1)
            return i;
    }
    if(i>=G.vexnum)
        return ERROR;
    else
        return 0;
}
void CreateDG(ALGraph &G)
{
    ArcNode *p,*q;
    char v1,v2;
    char v;
    int i,j,k,n;
    cout<<"请输入图的顶点数和弧数:"<<endl;
    cin>>G.vexnum;
    cin>>G.arcnum;
    cout<<"请输入顶点:"<<endl;

    for(i=0;i<G.vexnum;i++)
    {
        cin>>v;
        G.vertices[i].date=v;
        G.vertices[i].firstarc=NULL;
    }
    cout<<"请输入弧尾和弧头:";
    for(k=0;k<G.arcnum;k++)
    {
        cin>>v1;
        cin>>v2;
        i=LocateVex(G,v1);j=LocateVex(G,v2);

        if(G.vertices[i].firstarc==NULL)
        {
            p=(ArcNode *)new ArcNode;
            G.vertices[i].firstarc=p;
            q=G.vertices[i].firstarc;
        }
        else
        {
            q=G.vertices[i].firstarc;
            for(n=0;n<G.arcnum;n++,q=q->nextarc)
            {
                if(!q->nextarc)
                    break;
            }
            p=(ArcNode *)new ArcNode;
            q->nextarc=p;
            q=q->nextarc;
        }
        q->adjvex=j;
        q->nextarc=NULL;
    }
    cout<<"图构建成功!";
}
//----------------深度优先遍历--------------------//

bool visited[MAX_VERTEX_NUM];
int FirstAdjVex(ALGraph &G,int v)
{
    int i;
    int n=-1;
    ArcNode*p;
    p=G.vertices[v].firstarc;
    if(p)
    {
        i=p->adjvex;
        if(visited[i]==false)
            n=i;
    }
    return n;
}
int NextAdjVex(ALGraph &G,int v)
{
    int i;
    int n=-1;
    ArcNode *p;
    p=G.vertices[v].firstarc;
    for(i=p->adjvex;i<G.vexnum,p!=NULL;)
    {
        i=p->adjvex;
        if(visited[i]==false)
        {
            n=i;
            break;
        }
        else
            p=p->nextarc;
    }
    return n;
}

void VisitFuc(ALGraph &G,int v)
{
    cout<<G.vertices[v].date<<" ";
}
void DFS(ALGraph &G,int v)
{
    int w;
    visited[v]=true;
    VisitFuc(G,v);
    for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v))
        if(!visited[w]) DFS(G,w);

}
void DFSTraverse(ALGraph &G)
{
    int v;
    for(v=0;v<G.vexnum;v++)
        visited[v]=false;
    cout<<"深度优先搜索:"<<endl;
    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
            DFS(G,v);
    }
}
//----------------广度优先遍历--------------------//

void BFSTraverse(ALGraph &G)
{
    int v;
    int w;
    queue<int> q; //STL队列
    for(v=0;v<G.vexnum;v++)
        visited[v]=false;
//  InitQueue(Q);
    cout<<"广度优先搜索:";
    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
        {
            visited[v]=true;
            VisitFuc(G,v);

            q.push(v);   //v进队

            while(q.empty()!=true)
            {
                v = q.front();
                q.pop();
                for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v))
                {   if(!visited[w])
                    {
                        visited[w]=true;
                        VisitFuc(G,w);

                        q.push(w);
                    }
                }
            }
        }
    }
}
/////////////////////////////////////////////////////////////////
void menu()
{
    cout<<‘\n‘;
    cout<<" //---------------图的基本操作---------------//"<<endl;
    cout<<"  **     1、图的构建                        **"<<endl;
    cout<<"  **     2、深度优先遍历                    **"<<endl;
    cout<<"  **     3、广度优先遍历                    **"<<endl;
    cout<<"  --------------------------------------------"<<endl;
    cout<<"请输入数字进行选择:"<<endl;
}
int main()
{
    ALGraph G;
    int i;
    menu();
    cin>>i;
    while(i<4)
    {
        switch(i)
        {
        case 1:CreateDG(G);break;
        case 2:DFSTraverse(G);cout<<endl;break;
        case 3:BFSTraverse(G);cout<<endl;break;
        default:return ERROR;
        }
        menu();
        cin>>i;
    }
    return 0;
}
时间: 2024-10-10 16:57:26

数据结构与算法-图的遍历的相关文章

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

【系列文章】数据结构与算法——图

---恢复内容开始--- 接触C语言是很早以前的事了,大概是在初中二年级.后来发现只学语言,不学算法根本没用,于是乎萌发了学习数据结构和算法的想法,但一直没有什么实际进展.直到今天,才决定好好研究一番(ps:今年大一,甚是惭愧),顺便把学习过程记录在这一系列文章之中.好了,废话不多说,开始我这一系列的文章.文中可能有错误,如果你发现了,我恳请你帮我指出.谢谢. 图——图能很方便的描述一些实际问题,常用于寻找最优解类型的问题.其他相关概念,百度百科说的很清楚了. 学习图大概有以下几个过程. 一.创

[数据结构与算法] 二叉树及其遍历方式

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289830.html 一.数据结构分类 (一)按逻辑结构 集合(无辑关系) 线性结构(线性表):数组.链表.栈.队列 非线性结构:树.图.多维数组 (二)按存储结构 顺序(数组)储结构.链式储结构.索引储结构.散列储结构 二.二叉树相关性质

python数据结构与算法——图的基本实现及迭代器

本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自己思考怎么实现) 先定义顶点和边 1 class Vertex(object): 2 def __init__(self, label=''): 3 self.label = label 4 def __repr__(self): 5 return 'Vertex(%s)' % repr(self.label

数据结构(15):图 深度优先遍历(DFS)

/*-----------------------------------------------*/ /* 邻接矩阵的DFS */ // 基于 数据结构(14) 中的邻接矩阵的结构 #include <iostream> using namespace std; typedef char VertexType; typedef int EdgeType; const int MAXVEX = 100; const int INFINITY = 65535; typedef struct {

python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边

1 # Bellman-Ford核心算法 2 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 3 # 循环n-1轮,每轮对m条边进行一次松弛操作 4 5 # 定理: 6 # 在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边 7 # 最短路径肯定是一个不包含回路的简单路径(回路包括正权回路与负权回路) 8 # 1. 如果最短路径中包含正权回路,则去掉这个回路,一定可以得到更短的路径 9 # 2. 如果最短路径中包含负权回路,则每多走一次这个回路,路径更短,则不

python数据结构与算法——图的最短路径(Floyd-Warshall算法)

使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 1 # 城市地图(字典的字典) 2 # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直接距离 3 # 将不相连点设为INF,方便更新两点之间的最小值 4 INF = 99999 5 G = {1:{1:0, 2:2, 3:6, 4:4}, 6 2:{1:INF, 2:0, 3:3, 4:INF}, 7 3:{1:7, 2:INF, 3:0, 4:1}, 8 4:{1:5, 2

python数据结构与算法——图的最短路径(Dijkstra算法)

1 # Dijkstra算法——通过边实现松弛 2 # 指定一个点到其他各顶点的路径——单源最短路径 3 4 # 初始化图参数 5 G = {1:{1:0, 2:1, 3:12}, 6 2:{2:0, 3:9, 4:3}, 7 3:{3:0, 5:5}, 8 4:{3:4, 4:0, 5:13, 6:15}, 9 5:{5:0, 6:4}, 10 6:{6:0}} 11 12 13 # 每次找到离源点最近的一个顶点,然后以该顶点为重心进行扩展 14 # 最终的到源点到其余所有点的最短路径 15