No.5.2 图的广度优先遍历


重温一遍 No.4.3 层层递进-广度优先搜索:https://www.cnblogs.com/yalimy/p/15021065.html

/* No.1 广度优先搜索,只找出最短路径层数即可
struct node{
  int x;  //当前节点
  int y;  //层数
};
struct node que[100];
int head=1,tail=1;
int n,m,start,stop;
int cur;
int flag=0;
int a[100][100],book[10]={0};

int main(){
  int i,j;
  int x,y;

  scanf("%d %d %d %d",&n,&m,&start,&stop);

  //初始化图的二维矩阵

  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      if(i==j) a[i][j]=0;
      else a[i][j]=-1;
    }

  for(i=1;i<=m;i++){  //无向图,对称矩阵
    scanf("%d %d",&x,&y);
    a[x][y]=1;
    a[y][x]=1;
  }

  que[head].x=start;
  que[head].y=0;
  tail++;
  book[start]=1;

  while(head     cur=que[head].x;
    for(i=1;i<=n;i++){
      if(a[cur][i]==1 && book[i]==0){
        book[i]=1;
        que[tail].x=i;
        que[tail].y=que[head].y+1;
        tail++;
        if(i==stop){
          flag=1;
          break;
        }
      }
    }
    if(flag==1){
      break;
    }
    head++;
  }
  printf("%d",que[tail-1].y);
  getchar();getchar();return 0;
}
*/

/* No2. 广度优先算法:打印最短路径
struct node{
  int x;   //当前节点
  int y;   //父节点值
  int s;   //步数
};
struct node que[100];
int head=1,tail=1;
int n,m,start,stop;
int cur,hd;
int flag=0;
int a[100][100],book[10]={0};

int main(){
  int i,j;
  int x,y;

  scanf("%d %d %d %d",&n,&m,&start,&stop);

  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      if(i==j) a[i][j]=0;
      else a[i][j]=-1;
    }

  for(i=1;i<=m;i++){
    scanf("%d %d",&x,&y);
    a[x][y]=1;
    a[y][x]=1;
  }

  que[head].x=start;
  que[head].y=0;
  que[head].s=0;
  tail++;
  book[start]=1;


  hd=head; //使用临时变量,防止 que[head] 真的被释放
  while(head     cur=que[hd].x; // hd 移动时,cur的值随之改变
    for(i=1;i<=n;i++){
      if(a[cur][i]==1 && book[i]==0){
        book[i]=1;
        que[tail].x=i;
        que[tail].y=que[cur].x;
        que[tail].s=que[cur].s+1;
        tail++;
        if(i==stop){
          flag=1;
          break;
        }
      }
    }
    if(flag==1){
      break;
    }
    hd++; //指针前移
  }
  printf("最少遍历次数:%d\n",que[tail-1].s);
  printf("遍历节点如下:\t");
  for(i=head;i     printf("(%d,%d,%d)\t",que[i].x,que[i].y,que[i].s);

  printf("\n最短路径为:(%d,%d,%d)\t",que[tail-1].x,que[tail-1].y,que[tail-1].s);
  cur=tail-1;
  for(i=cur-1;i>=head;i--){
    if(que[i].x==que[cur].y && que[i].s==que[cur].s-1){
      printf("(%d,%d,%d)\t",que[i].x,que[i].y,que[i].s);
      cur=i; //通过 cur 实现自我递归!
    }
    else
      continue;
  }
  getchar();getchar();return 0;
}
*/

/* No3. 广度优先算法:打印最短路径
struct node{
  int x;   //当前节点
  int y;   //指向父节点所在队列的索引位置
  int s;   //步数
};
struct node que[100];
int head=1,tail=1;
int n,m,start,stop;
int cur,hd;
int flag=0;
int a[100][100],book[10]={0};

int main(){
  int i,j;
  int x,y;

  scanf("%d %d %d %d",&n,&m,&start,&stop);

  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      if(i==j) a[i][j]=0;
      else a[i][j]=-1;
    }

  for(i=1;i<=m;i++){
    scanf("%d %d",&x,&y);
    a[x][y]=1;
    a[y][x]=1;
  }

  que[head].x=start;
  que[head].y=0;
  que[head].s=0;
  tail++;
  book[start]=1;


  hd=head;
  while(head     cur=que[hd].x;
    for(i=1;i<=n;i++){
      if(a[cur][i]==1 && book[i]==0){
        book[i]=1;
        que[tail].x=i;
        que[tail].y=hd;    //父节点所在队列的索引下标
        que[tail].s=que[cur].s+1;
        tail++;
        if(i==stop){
          flag=1;
          break;
        }
      }
    }
    if(flag==1){
      break;
    }
    hd++;
  }


  printf("最少遍历次数:%d\n",que[tail-1].s);
  printf("遍历节点如下:\t");
  for(i=head;i     printf("(%d,%d,%d)\t",que[i].x,que[i].y,que[i].s);

  printf("\n最短路径为:(%d,%d,%d)\t",que[tail-1].x,que[tail-1].y,que[tail-1].s);
  cur=tail-1;
  while(cur>head){    //注意,这里是大于head!
    cur=que[cur].y;    //直接找到父节点的索引坐标
    printf("(%d,%d,%d)\t",que[cur].x,que[cur].y,que[cur].s);
  }
  getchar();getchar();return 0;
}
*/

相关