题目链接:点击打开链接
数据结构实验之图论二:基于邻接表的广度优先搜索遍历
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顶点的无向边。
对于每组数据,第一行是三个整数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 <bits/stdc++.h>
#include <algorithm>
using namespace std;
struct node
{
int data;
node *next;
};
int vexnum,edgenum,start;
bool vis[110];
node *p,*head[110];
void BFS(int start)
{
for(int i = 0;i < vexnum;i++)
///(同一个结点的同层邻接点,节点编号小的优先遍历)排序,将节点小的放在之前;
{
for(node *p = head[i]->next; p ;p = p->next)
{
for(node *q = p->next; q ;q = q->next)
{
if(p->data > q->data)
{
int t = p->data;
p->data = q->data;
q->data = t;
}
}
}
}
queue<int > Q;
Q.push(start);
vis[start] = 1;
while(!Q.empty())
{
int m = Q.front();
printf("%d ",m);
Q.pop();
for(p = head[m]->next; p ;p = p->next)
{
if(!vis[p->data])
{
vis[p->data] = 1;
Q.push(p->data);
}
}
}
}
int main()
{
int t;
int u,v;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < 110; i++)
{
head[i] = new node;
head[i]->next = NULL;
}
scanf("%d%d%d",&vexnum,&edgenum,&start);
for(int i = 0;i < edgenum;i++)
{
scanf("%d%d",&u,&v);
p = new node;
p->data = v;
p->next = head[u]->next;
head[u]->next = p;
p = new node;
p->data = u;
p->next = head[v]->next;
head[v]->next = p;
}
BFS(start);
printf("\n");
}
return 0;
}
hhh,非STL做法:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define Maxsize 1100
using namespace std;
int flag;
int vis[Maxsize];
struct node
{
int data;
node *next;
};
typedef struct
{
node *Front;
node *rear;
int length;
}Squeue;
int Init_Squeue(Squeue &Q)
{
Q.Front = Q.rear = (node*)malloc(Maxsize*sizeof(node));
if(!Q.Front)
return -1;
Q.Front->next = NULL;
Q.rear->next = NULL;
Q.length = 0;
return 0;
}
void Push_Queue(Squeue &Q,int k)
{
node *p;
p = new node;
p->data = k;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length++;
}
void Pop_Queue(Squeue &Q)
{
node *p;
p = new node;
p = Q.Front->next;
Q.Front->next = p->next;
if(Q.rear == p)
Q.rear = Q.Front;
free(p);
Q.length--;
}
int Is_empty(Squeue &Q)
{
if(Q.rear == Q.Front)
return 1;
else
return 0;
}
int Gettop(Squeue &Q)
{
node *p;
p = new node;
p = Q.Front->next;
return p->data;
}
typedef struct edge_node//边表结点
{
int edge_data;
edge_node *edge_next;
}edge_node;
typedef struct//头结点
{
int first_data;
edge_node *first_edge;
}vex_node;
typedef struct
{
int vexnum,arcnum,start;
vex_node List[Maxsize];
}Graph;
Graph *Creat_Graph()
{
int u,v;
Graph *G;
edge_node *S;
G = (Graph *)malloc(sizeof(Graph));
scanf("%d%d%d",&G->vexnum,&G->arcnum,&G->start);
for(int i = 0;i < G->vexnum;i++)
{
G->List[i].first_data = i;
G->List[i].first_edge = NULL;
}
for(int i = 0;i < G->arcnum;i++)
{
scanf("%d%d",&u,&v);
S = (edge_node*)malloc(sizeof(edge_node));
S->edge_data = u;
S->edge_next = G->List[v].first_edge;
G->List[v].first_edge = S;
S = (edge_node*)malloc(sizeof(edge_node));
S->edge_data = v;
S->edge_next = G->List[u].first_edge;
G->List[u].first_edge = S;
}
return G;
}
void BFS(Graph *G,int k)
{
Squeue Q;
edge_node *w;
Init_Squeue(Q);
Push_Queue(Q,k);
vis[k] = 1;
while(!Is_empty(Q))
{
int p = Gettop(Q);
if(flag == 1)
{
cout<<p;
flag++;
}
else
printf(" %d",p);
Pop_Queue(Q);
for(w = G->List[p].first_edge;w;w = w->edge_next)
{
if(!vis[w->edge_data])
{
vis[w->edge_data] = 1;
Push_Queue(Q,w->edge_data);
}
}
}
}
void BFSTreavers(Graph *G)
{
edge_node *p,*q,*w;
memset(vis,0,sizeof(vis));
for(int i = 0;i < G->vexnum;i++)
{
for(p = G->List[i].first_edge;p;p = p->edge_next)
{
for(q = p->edge_next;q;q = q->edge_next)
{
if(p->edge_data > q->edge_data)
{
int t = p->edge_data;
p->edge_data = q->edge_data;
q->edge_data = t;
}
}
}
}
BFS(G,G->start);
for(int i = 0;i < G->vexnum;i++)
if(!vis[i])
BFS(G,i);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
Graph *G;
G = Creat_Graph();
flag = 1;
BFSTreavers(G);
printf("\n");
}
return 0;
}