数据结构实验图论:基于邻接矩阵/邻接表的广度优先搜索遍历(BFS)
2014-02-19 19:59
537 查看
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
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; }
相关文章推荐
- 数据结构实验图论一:基于邻接矩阵/邻接表的广度优先搜索遍历
- sdut oj2141 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历(BFS)
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历(BFS)
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历