您的位置:首页 > 理论基础 > 数据结构算法

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

2016-11-26 09:48 483 查看
数据结构实验之图论二:基于邻接表的广度优先搜索遍历

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=100+10;
int n,m,s;
bool vis[MAXN];
int head[MAXN];
int cnt;
struct node
{
int v;
int next;
}edge[5000];
void add(int u,int v)
{
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool check(int u,int v)
{
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(edge[i].v==v)return 1;
}
return 0;
}
void bfs(int s)
{
memset(vis,0,sizeof(vis));
int q[110];
int qhead=0,qtail=0;
vis[s]=1;
q[qtail++]=s;
while(qhead<qtail)
{
int k=q[qhead++];
printf("%d ",k);
for(int i=0;i<n;++i)
{
if(!vis[i]&&check(k,i))
{
vis[i]=1;
q[qtail++]=i;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&s);
memset(head,-1,sizeof(head));
int u,v;
cnt=0;
for(int i=0;i<m;++i)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
bfs(s);
puts("");
}
return 0;
}


错误的代码
/*#include<stdio.h>
#include<string.h>

int k, m, t;
int visit[200], b[200];  //visit是标记数组;b数组用来存放搜索的点,每次搜索一遍经排序后就输出

struct node
{
int u, v;
node *next;
}*head[200];  //;邻接表

void add(int u, int v)
{
node *p=new node;
p->u=u;
p->v=v;
p->next=head[u];
head[u]=p;
}

void bfs(int t)
{
node *p=new node;
visit[t]=1;
p=head[t];
int s=1;
while(p)
{
if(visit[p->v]==0)
{
b[s++]=p->v;
visit[p->v]=1;
p=p->next;
}
else
{
p=p->next;
}

for(int i=1;i<s;i++)  //用冒泡把每次搜索到的与同一个节点同层的邻接点从小到大排序
{
for(int j=1;j<s-i;j++)
{
if(b[j]>b[j+1])
{
int t;
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(int i=1;i<s;i++)  //把每次搜索到的节点输出
printf(" %d", b[i]);
for(int i=1;i<s;i++)  //广度优先搜索
bfs(b[i]);
}

int main()
{
int n, u, v;
scanf("%d", &n);
while(n--)
{
memset(visit,0,sizeof(visit));
memset(head,NULL,sizeof(head));
scanf("%d%d%d", &k, &m, &t);
while(m--)
{
scanf("%d%d", &u, &v);
add(u, v);  //add函数建立邻接表
add(v, u);
}
printf("%d", t);  //先把最先需要搜索的点输出,即遍历的起始点
bfs(t);
printf("\n");
}
return 0;
}  */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐