例题
BFS算法遍历模板:
#include <stdio.h>
int book[110] = {0}, e[110][110];
int n;
int que[10010], head, tail;
int main()
{
scanf("%d", &n);
int i, j;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(i == j)
e[i][j] = 0;
else
e[i][j] = 99999999;
}
}
int a, b;
for(i = 1; i <= n; i++)
{
scanf("%d %d", &a, &b);
e[a][b] = 1;
e[b][a] = 1;
}
head = 1;
tail = 1;
que[tail] = 1;
tail++;
book[1] = 1;
int cur;
while(head < tail && tail <= n)
{
cur = que[head];
for(i = 1; i <= n; i++)
{
if(e[cur][i] == 1 && book[i] == 0)
{
book[i] = 1;
que[tail] = i;
tail++;
}
if(tail > n)
break;
}
head++;
}
for(i = 1; i < tail; i++)
printf("%d ", que[i]);
return 0;
}
输入样例:
5
1 2
1 3
1 5
2 4
3 5
输出:
1 2 3 5 4
作者:boxyit
链接:https://www.acwing.com/blog/content/3469/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
bool g[105][105]={0}; //这里n小我就直接邻接矩阵了,如果用邻接表还能快点
bool v[105]={0};
int n,num[105],ans=1<<30;
struct node{
int u,step;
};
int bfs(int x){ //bfs找当前点x为医院设置点时的总距离
memset(v,0,sizeof(v));
queue<node> q;
v[x]=1;
q.push((node){x,0});
int sum=0;
while(!q.empty()){
node now=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(g[now.u][i]&&!v[i]){
node next={i,now.step+1};
sum+=num[i]*next.step;
v[i]=1;
q.push(next);
}
}
return sum;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,l,r;
scanf("%d%d%d",&a,&l,&r);
num[i]=a;
if(l) g[i][l]=g[l][i]=1;
if(r) g[i][r]=g[r][i]=1;
}
for(int i=1;i<=n;i++)
ans=min(ans,bfs(i));
printf("%d",ans);
return 0;
}