zoukankan      html  css  js  c++  java
  • SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186

    题目描述

    给定一个无向连通图,顶点编号从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

    主要难点是用邻接表去存,相比于邻接矩阵这个要稍麻烦一点,原则上有两种做法,先介绍用queue和vector的那种做法。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<queue>
     5 #include<vector>
     6 using namespace std;
     7 priority_queue<int ,vector<int >,greater<int> >sort[151];
     8 //sort数组是凡是与sort的下标相连的点组成的队列,且为优先队列
     9 queue<int>q;//建立q普通队列
    10 int u,v;
    11 int mark;//控制输出
    12 int vis[151];//标记数组
    13 void BFS(int kk)
    14 {
    15     q.push(kk);// 是首元素,直接加入队列
    16     vis[kk]=1;
    17     while(!q.empty())//判断是否为空
    18     {
    19         int s=q.front();//取队列首元素
    20         q.pop();//删除队列头元素,就是下面直接输出
    21         if(mark)//控制输出空格
    22         {
    23             cout<<s;
    24             mark=0;
    25         }
    26         else
    27             printf(" %d",s);
    28         while(!sort[s].empty())//判断这个相关联队列是否为空
    29         {
    30             int ss=sort[s].top();//取它的队列首元素
    31             if(!vis[ss])//如果没被标记
    32             {
    33                 q.push(ss);//就加入q队列中
    34                 vis[ss]=1;
    35             }
    36             sort[s].pop();//直接删除掉这个队列首元素
    37         }
    38     }
    39 }
    40 
    41 int main()
    42 {
    43     //memset(map,0,sizeof(map));
    44 
    45 
    46     while(!q.empty())//将队列清空
    47         q.pop();
    48     int n;
    49     cin>>n;
    50     for(int i=1; i<=n; i++)
    51     {
    52         memset(vis,0,sizeof(vis));
    53         int k,m,t;
    54         cin>>k>>m>>t;
    55         for(int k=1; k<=m; k++)//将队列清空
    56         {
    57             while(!sort[k].empty())
    58             {
    59                 sort[k].pop();
    60             }
    61         }
    62         for(int j=1; j<=m; j++)
    63         {
    64             cin>>u>>v;
    65             sort[u].push(v);//因为是用邻接表在存储,所以用这种形式表示与u有关联的点存在sort这个队列中
    66             sort[v].push(u);
    67         }
    68 
    69         mark=1;
    70         BFS(t);
    71         printf("
    ");
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    (转)expfilt 命令
    (转)第二十三节 inotify事件监控工具
    数据结构之平衡二叉树(AVL)
    安装apache2.4.10
    centos下编译安装mysql5.6
    随机 I/O & 顺序 I/O
    什么是mysql中的元数据
    linux中mail函数不能发送邮件怎么办
    检测MYSQL不同步发邮件通知的脚本
    mysql自动备份策略
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3222496.html
Copyright © 2011-2022 走看看