数据结构之 图论---bfs(邻接表)

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

输入

输入第一行为整数n(0< n <100),表示数据的组数。
对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。
下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

输出

输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。

示例输入

1
6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5

示例输出

0 3 4 2 5 1 

 代码:
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>;

using namespace std;

struct node
{
    int data;
    int next;
}a[6000];

int cnt;
int head[101];
void Insert_edge(int u, int v)
{
    a[cnt].data=u;
    a[cnt].next=head[v];
    head[v]=cnt++;
}

int list[101],e;
void bfs(int n, int s) //n个点, s是起点
{
    queue<int>q;
    bool vis[101];
    memset(vis, false, sizeof(vis));
    q.push(s);
    vis[s]=true;
    int i, dd; //当前队首元素
    int ff;

    while(!q.empty())
    {
        dd=q.front();
        q.pop();
        list[e++]=dd;
        int w[101], p=0;
        //queue<int>p;
        for(i=head[dd]; i!=-1; i=a[i].next )
        {
            ff=a[i].data;
            if(vis[ff]==false)
            {
                //p.push(ff);
                w[p++]=ff;
                vis[ff]=true;
            }
        }
        sort(w, w+p); //排序 为了保证大小顺序
        for(i=0; i<p; i++)
        {
           q.push(w[i]);  //遍历结果加入队列
        }
    }
    while(!q.empty())
    {
        ff=q.front();
        q.pop();
        list[e++]=ff;
    }
}

int main()
{
    int t;
    cin>>t;
    int i, j;
    int n, m, u, v;
    int start;

    while(t--)
    {
        cin>>n>>m>>start;
        cnt=0;
        memset(head, -1, sizeof(head));
        for(i=0; i<m; i++)
        {
            cin>>u>>v;
            Insert_edge(u, v);
            Insert_edge(v, u); //无向图插入边
        }
        bfs(n, start);
        for(i=0; i<e; i++)
        {
            if(i==0)
              cout<<list[i];
            else
              cout<<" "<<list[i];
        }
        cout<<endl;
    }
    return 0;
}
时间: 2025-01-01 16:42:31

数据结构之 图论---bfs(邻接表)的相关文章

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间

bfs 邻接表(需要优化 可能会RE *【模板】)

//---基于邻接表的bfs #include <stdio.h> #include <string.h> #include <iostream> #include <string> #include <algorithm> #include <queue> using namespace std; struct node { int date; struct node *next; }*head[101], *tail[101];

数据结构实践——操作用邻接表存储的图

本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的一个顶点,输出该顶点编号: (3)计算图G中出度为0的顶点数: (4)判断图G中是否存在边<i,j>. 利用下图作为测试用图,输出结果. 提示:(1)分别设计函数实现算法:(2)不要全部实现完再测试,而是实现一个,测试一个:(3)请利用图算法库. [参考解答] #include <stdi

hpu 1713 参观城市 &lt;bfs+邻接表&gt;

1713: 参观城市 时间限制: 1 Sec  内存限制: 128 MB 提交: 35  解决: 20 [提交][状态][讨论版] 题目描述 有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,小明在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1&

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

数据结构之图的邻接表

1.邻接表的简介: 图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中.如词条概念图所示,表结点存放的是邻接顶点在数组中的索引.对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点.[1] 邻接

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,

图论之邻接表的数组实现

虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷: 当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来: 这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了--邻接表,当然使用vector数组也是一种良好的选择: 邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法: 首先,有三个数组,分别为u[max],v[max],w[max]分别代表着每条边的起点,终点,权重,而下标则代表着边的编号: 然后设立f

第六章部分例题 双向bfs邻接表和邻接矩阵实现

Idealpath 双向bfs输出颜色,邻接矩阵实现 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <map> 6 #include <algorithm> 7 8 using namespace std; 9 10 const int maxn=10000; 11 const int inf=1