• 8649 图的广度遍历


    8649 图的广度遍历

    时间限制:1000MS  内存限制:1000K
    提交次数:1573 通过次数:975

    题型: 编程题   语言: G++;GCC

     

    Description

    使用图的深度遍历实现的邻接表存储结构和基本操作函数,在此基础上实现图的广度遍历算法并加以测试。注意正确使用队列存储结构。
    




    输入格式

    第一行:输入0到3之间整数(有向图:0,有向网:1,无向图:2,无向网:3);
    第二行:输入顶点数和边数;
    第三行:输入各个顶点的值(字符型,长度〈3);(遍历从输入的第一个顶点开始)
    第四行:输入每条弧(边)弧尾和弧头(以空格作为间隔),如果是网还要输入权值;
    



    输出格式

    输出对图广度遍历的结果
    



     

    输入样例

    0
    3 3
    a b c
    a b
    b c
    c b
    



     

    输出样例

    a b c
    



     

    提示

    
    



     

    作者

     yqm

      SCAU数据结构课的一道oj题,,,因为懒.所以不想按学校发的那本数据结构书的方法来做,,而且也不考效率,于是就在题目里直接用STL的queue<>和stack<>来代替宽搜中要用到的队列和邻接表中的链表。。。代码量也就可以少很多了

      

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <cstdlib>
     7 #include <cctype>
     8 #include <queue>
     9 #include <stack>
    10 #include <map>
    11 #include <vector>
    12 #include <set>
    13 #include <utility>
    14 #define ll long long
    15 #define inf 0x3f3f3f3f
    16 using namespace std;
    17 
    18 typedef struct node//表明顶点的结点,当然也可以直接用string
    19 {
    20     char name[4];
    21 } node;
    22 node temp;
    23 stack<node> q[100005];//这里用栈来代替每个顶点所延伸出来的链表
    24 char t1[4],t2[4];
    25 int book[100005];
    26 int v(char a[]) //该函数用来记录结点的字符串所对应的权值
    27 {
    28     if(strlen(a)==1)
    29         return a[0];
    30     else
    31         return a[0]*122+a[1];
    32 }
    33 int main()
    34 {
    35     //freopen("input.txt","r",stdin);
    36     memset(book,0,sizeof(book));
    37     int type;
    38     scanf("%d",&type);
    39     int n,m,w;
    40     node first;
    41     scanf("%d%d",&n,&m);
    42     for(int i=0; i<n; i++)
    43     {
    44         scanf("%s",t1);
    45         if(i==0)
    46         {
    47             strcpy(first.name,t1);
    48         }
    49     }
    50     while(m--)
    51     {
    52         if(type==1||type==3)
    53             scanf("%d%s%s",&w,t1,t2);
    54         else
    55             scanf("%s%s",t1,t2);
    56         if(type==2||type==3)//如果是无向图
    57         {
    58             strcpy(temp.name,t1);
    59             q[v(t2)].push(temp);
    60             strcpy(temp.name,t2);
    61             q[v(t1)].push(temp);
    62         }
    63         else //如果是有向图
    64         {
    65             strcpy(temp.name,t2);
    66             q[v(t1)].push(temp);
    67         }
    68     }
    69     //
    70     int tt;
    71     queue<node> tq;//进行宽搜要用到的队列
    72     tq.push(first);
    73     while(!tq.empty())
    74     {
    75         tt=v(tq.front().name);
    76         if(!book[tt])//标记是否已访问过该顶点
    77         {
    78             printf("%s ",tq.front().name);
    79             book[tt]=1;
    80         }
    81         while(!q[tt].empty())//将该点所有出边加入队列
    82         {
    83             tq.push(q[tt].top());
    84             q[tt].pop();
    85         }
    86         tq.pop();
    87     }
    88     return 0;
    89 }

       最好呢。。还是能够掌握了书本上的用链表的方法的好,,,(好吧...我还是太懒了。。。)

  • 相关阅读:
    【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
    【算法】LRU算法
    细说分布式锁
    【Python】Python3.4+Matplotlib详细安装教程
    LoRaWAN协议(二)--LoRaWAN MAC数据包格式
    LoRaWAN移植笔记(一)__RTC闹钟链表的实现
    cJSON_json包的C语言解析库
    LoRaWAN协议(一)--架构解析
    STM32L051 PVD的调试
    以帧为存储单位的循环stack
  • 原文地址:https://www.cnblogs.com/geek1116/p/5531925.html
Copyright © 2020-2023  润新知