sdut 2141 BFS(用邻接矩阵和邻接表(采用优先队列)实现
2017-11-15 10:10
387 查看
Problem Description
给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)
Input
输入第一行为整数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顶点的无向边。
Output
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。
Example Input
1 6 7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5
Example Output
0 3 4 2 5 1
Hint
以邻接矩阵作为存储结构。#include <bits/stdc++.h> using namespace std; int k,m,t; int edge[105][105],vis[105]; void BFS(int n0) { queue<int>Q; int s,flag=0; vis[n0]=1; Q.push(n0); while(!Q.empty()) { s=Q.front(); Q.pop(); if(!flag) { cout<<s; flag=1; } else cout<<' '<<s; for(int i=0;i<k;++i) if(!vis[i]&&edge[s][i]) { vis[i]=1; Q.push(i); } } cout<<endl; } int main() { int n,p,q; cin>>n; while(n--) { memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); cin>>k>>m>>t; for(int i=0;i<m;++i) { cin>>p>>q; edge[p][q]=edge[q][p]=1; } BFS(t); } return 0; } /*************************************************** User name: YT1658506207邵雪源 Result: Accepted Take time: 0ms Take Memory: 244KB Submit time: 2017-11-14 19:29:26 ****************************************************/用优先队列替代邻接表的形式实现的:
#include <bits/stdc++.h> using namespace std; int vis[105],k,m,t; priority_queue<int ,vector<int>,greater<int> > s[105]; //相当于定义一个邻接表的结构 void BFS(int n0) { int ss,flag=0; queue<int>Q;//还是一个维护队列 vis[n0]=1; Q.push(n0); while(!Q.empty()) { ss=Q.front(); Q.pop(); if(!flag) { flag=1; cout<<ss; } else cout<<' '<<ss; while(!s[ss].empty())//相当于一个组数形式的邻接表中的一个头节点(而且只后的数值都因为是优先队列而按照从小到大的顺序排列好了)一次访问之后与之有边的节点 { int r=s[ss].top();//取它的队列首元素 if(!vis[r])//如果没被标记 { vis[r]=1; Q.push(r);//就加入q队列中 } s[ss].pop(); } } } int main() { int n,p,q; cin>>n; while(n--) { cin>>k>>m>>t; for(int k=1;k<=m;++k)//因为这组数据只用到1...m之间的大小 while(!s[k].empty()) s[k].pop(); for(int k=0;k<m;++k) { cin>>p>>q; s[p].push(q); s[q].push(p); } BFS(t); } } /*************************************************** User name: YT1658506207邵雪源 Result: Accepted Take time: 0ms Take Memory: 208KB Submit time: 2017-11-14 20:39:33 ****************************************************/
相关文章推荐
- [SDUT](2141)数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 ---BFS(图)
- 图的广度优先遍历BFS(分别以邻接矩阵和邻接链表实现)
- SDUT 2141 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
- 邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)
- 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS
- 第七章 图(邻接矩阵和邻接表建立图并实现DFS、BFS)
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 数据结构——图的BFS的邻接矩阵遍历(BFS是由队列实现的)
- SDUT 2141 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- POJ-1724-ROADS(优先队列,邻接表,BFS)
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- BFS 八数码问题 typedef int State[9]; (BFS A*算法与优先队列)
- C#定时任务采用线程和队列实现
- 采用stack实现的文件夹循环深度优先遍历的基类
- NYOJ 635-Oh, my goddess【bfs+优先队列】
- hrbust 1434 Quick out of the Harbour【Bfs+优先队列】
- 无向图的邻接矩阵和邻接表实现各种操作 -- C++语言描述
- NYOJ 284 坦克大战 【BFS】+【优先队列】