数据结构实验图论:基于邻接矩阵/邻接表的广度优先搜索遍历(BFS)

本文主要是介绍数据结构实验图论:基于邻接矩阵/邻接表的广度优先搜索遍历(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

提示

以邻接矩阵作为存储结构。

解题报告
用邻接矩阵把边的信息存下来,从开始的点出发,把与开始的点相连的点入队列,访问过的点设为1,防止再次访问。。。(bfs)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int mmap[100][100];
int vv[100];
void bfs(int t,int n)
{queue<int>Q;Q.push(t);vv[t]=1;int f=1;int q;while(!Q.empty()){q=Q.front();Q.pop();if(f){f=0;printf("%d",q);}else printf(" %d",q);for(int i=0;i<n;i++)//找与q点相连接的点{if(!vv[i]&&mmap[q][i])//mmap[q][i]==1表示q点与i点相连接,!vv[i]表示i点没有找过{Q.push(i);vv[i]=1;}}}
}
int main()
{int n,k,m,t;int i,j;int u,v;scanf("%d",&n);while(n--){memset(mmap,0,sizeof(mmap));memset(vv,0,sizeof(vv));scanf("%d%d%d",&k,&m,&t);for(i=0;i<m;i++){scanf("%d%d",&u,&v);mmap[u][v]=mmap[v][u]=1;}bfs(t,k);}return 0;
}



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

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 <stdlib.h>
//#include <stdio.h>
//#include <string.h>
//#include <queue>
//#define M 20
//#define swap(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
//using namespace std;
//struct node
//{
//    int u,v;
//    node *next;
//}*head[M];
//int vv[M],f=1;
//int cmpp(const void *a,const void *b)
//{
//    return (*(int *)a-*(int *)b);
//}
//void add(int u,int v)
//{
//    node *p=new node;
//    p->v=v;
//    p->next=head[u];
//    head[u]=p;
//}
//int b[100],x[100];
//void bfs(int t)
//{
//    int q,k=0;
//    queue<int>Q;
//    Q.push(t);
//    vv[t]=1;
//    f=1;
//    while(!Q.empty())
//    {
//        q=Q.front();
//        Q.pop();
//        x[++k]=q;
//        int i=0;
//        for(node *p=head[q];p!=NULL;p=p->next)
//        {
//            if(vv[p->v]==0)
//            {
//                b[i++]=p->v;
//                vv[p->v]=1;
//            }
//        }
//        if(i>=1)qsort(b,i,sizeof(b[0]),cmpp);
//        for(int j=0;j<=i-1;j++)
//            Q.push(b[j]);
//    }
//    int j;
//    for( j=1;j<=k-1;j++)
//        printf("%d ",x[j]);
//    printf("%d",x[j]);
//}
//
//struct N
//{
//    int u,v;
//} num[100];
//int cmp(const void *a,const void *b)
//{
//    return (((N *)b)->v-((N *)a)->v);
//}
//int main()
//{
//    int n,k,m;
//    int i,j;
//    int u,v,t;
//    scanf("%d",&n);
//    while(n--)
//    {
//        scanf("%d %d %d",&k,&m,&t);
//        memset(head,NULL,sizeof(head));
//        memset(vv,0,sizeof(vv));
//        for(i=0; i<m; i++)
//        {
//            scanf("%d%d",&u,&v);
//            add(u,v);
//            add(v,u);
//        }
//        bfs(t);
//        printf("\n");
//    }
//    return 0;
//}
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <queue>
#define M 20
#define swap(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
using namespace std;
struct node
{int u,v;node *next;
}*head[M];
int vv[M],f=1;void add(int u,int v)
{node *p=new node;p->v=v;p->next=head[u];head[u]=p;
}
int n,k,m;
int b[100],x[100];
void bfs(int t)
{int q,k=0;queue<int>Q;Q.push(t);vv[t]=1;f=1;while(!Q.empty()){q=Q.front();Q.pop();if(f){f=0;printf("%d",q);}else printf(" %d",q);for(node *p=head[q]; p!=NULL; p=p->next){if(vv[p->v]==0){Q.push(p->v);vv[p->v]=1;}}}
}struct N
{int u,v;
} num[100];int main()
{int i,j;int u,v,t;scanf("%d",&n);while(n--){scanf("%d %d %d",&k,&m,&t);memset(head,NULL,sizeof(head));memset(vv,0,sizeof(vv));for(i=0; i<m; i++){scanf("%d %d",&u,&v);add(u,v);add(v,u);}int tt;for(int i=0; i<m; i++)//对邻接链表排序{node *p,*q;for(p=head[i]; p; p=p->next)for(q=p->next; q; q=q->next){if(p->v>q->v)swap(p->v,q->v,tt);}}bfs(t);printf("\n");}return 0;
}


这篇关于数据结构实验图论:基于邻接矩阵/邻接表的广度优先搜索遍历(BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135571

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为