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


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

    Time Limit: 1000MS Memory Limit: 65536KB

    Problem Description

    给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

    Input

    输入第一行为整数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顶点的无向边。

    Output

    输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。

    Example Input

    1
    6 7 0
    0 3
    0 4
    1 4
    1 5
    2 3
    2 4
    3 5

    Example Output

    0 3 4 2 5 1

    Hint

    用邻接表存储。
     

    DQE:

     
     基于邻接表的图的广度优先搜索,利用栈纠正创建弧链表时颠倒的邻接点大小顺序。
     
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <queue>
      4 #include <stack>
      5 using namespace std;
      6 
      7 #define MVN 110
      8 
      9 typedef struct ArcNode
     10 {
     11     int adj;
     12     ArcNode *next;
     13     char *info;
     14 }AN;    //弧结点
     15 
     16 typedef struct VNode
     17 {
     18     int x;
     19     AN *first;
     20 }VN;    //顶点节点
     21 
     22 typedef struct ALGraph
     23 {
     24     VN vex[MVN];
     25     int vexn,arcn;
     26     int s;
     27 }ALG;    //基于邻接表的图
     28 
     29 void creat(ALG &G)
     30 {
     31     int i,j,k;
     32     for(k=0;k<G.vexn;k++)
     33         G.vex[k].first=NULL;
     34     for(k=0;k<G.arcn;k++)
     35     {
     36         scanf("%d %d",&i,&j);
     37         AN *ia=new AN,*ja=new AN;
     38         ia->adj=j;
     39         ja->adj=i;
     40         ia->next=G.vex[i].first;
     41         ja->next=G.vex[j].first;
     42         G.vex[i].first=ia;
     43         G.vex[j].first=ja;
     44     }
     45 }
     46 
     47 void BFS(ALG &G)
     48 {
     49     int i;
     50     queue <int> Q;
     51     stack <int> S;
     52     bool f[MVN]={false};
     53     Q.push(G.s);
     54     while(!Q.empty())
     55     {
     56         i=Q.front();Q.pop();
     57         if(!f[i])
     58         {
     59             AN *p=G.vex[i].first;
     60             while(p)
     61             {
     62                 S.push(p->adj);
     63                 p=p->next;
     64             }
     65             //利用栈纠正临接点顺序
     66             while(!S.empty())
     67             {
     68                 Q.push(S.top());S.pop();
     69             }
     70             if(i==G.s)
     71                 printf("%d",i);
     72             else
     73                 printf(" %d",i);
     74             f[i]=true;
     75         }
     76     }
     77     printf("
    ");
     78 }
     79 
     80 int main()
     81 {
     82     int t;
     83     scanf("%d",&t);
     84     while(t--)
     85     {
     86         ALG G;
     87         scanf("%d %d %d",&G.vexn,&G.arcn,&G.s);
     88         creat(G);
     89         BFS(G);
     90     }
     91     return 0;
     92 }
     93 
     94 /***************************************************
     95 User name: ***
     96 Result: Accepted
     97 Take time: 0ms
     98 Take Memory: 156KB
     99 Submit time: 2016-11-18 19:51:04
    100 ****************************************************/
  • 相关阅读:
    HashMap,Hash优化与高效散列
    Dubbo Overview
    模板引擎 引自 《PHP核心技术与最佳实践》
    使用 phpStorm 开发
    使用 Zend_Studio 开发
    Symfony 2.0 认识Request, Response, Session, Cookie
    Symfony 建立一个Bundle
    Symfony 从路由认识它
    信鸽推送.net 服务端代码
    c#输出json,其中包含子json (可以含 无限级 子json)的方法思路
  • 原文地址:https://www.cnblogs.com/Leroscox/p/6034491.html
Copyright © 2020-2023  润新知