ACM题目————图的广度优先搜索

题目描述

图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”--“Z”中的若干字符表示,且要求结点的访问顺序要求根据由 “A”至“Z”的字典顺序进行访问。

输入

输入只包含一个测试用例,第一行为一个自然数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相应的边的长度。

最后一行为一个字符,表示要求进行广度优先搜索的起始顶点。

输出

用一行输出广度优先搜索结果,起始点为给定的顶点,各顶点之间用一个空格隔开。要求同一顶点的邻接点的访问顺序按“A”---“Z”的字典顺序。

样例输入

5
HUEAK
0 0 2 3 0
0 0 0 7 4
2 0 0 0 0
3 7 0 0 1
0 4 0 1 0
H

样例输出

H A E K
//Asimple
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <queue>

using namespace std;
const int maxn = 101;
int n, T, num, cnt, point, line, x, y;
int start_x, start_y, end_x, end_y;
string str;
char ch;
queue<int> q;
int vis[maxn];//标记数组,标记是否走过
char Map[maxn][maxn];//地图
int a[26];

void BFS(char ch)
{
    int v;
    q.push(ch-‘A‘);
    while ( !q.empty() )
    {
        memset(a,0,sizeof(a));
        v = -1 ;
        for(int i=0; i<n; i++)
            if( vis[i]==0 && str[i] == q.front()+‘A‘ )
            {
                vis[i] = 1 ;
                if( v == -1 ) v = i ;
            }
        if( v == -1 ) break ;
        printf( cnt ++ ==0 ? "%c" : " %c", str[v]);
        for(int i=0; i<n; i++)
            if(vis[i]==0 && Map[v][i] )
                a[str[i]-‘A‘] ++ ;
        for(int i=0; i<26; i++)
            for(int j=0; j<a[i]; j++)
                q.push(i);
        q.pop();
    }
}

int main()
{
    cin >> n >> str ;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ )
        {
            cin >> num ;
            Map[i][j] = num ;
        }
    cin >> ch ;
    BFS(ch);

    return 0;
}
时间: 2024-10-05 20:42:49

ACM题目————图的广度优先搜索的相关文章

图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_VERTEX_NUM 20 4 #define MAXQSIZE 100 5 #define OK 1 6 typedef char VertexType; 7 typedef int QElemType; 8 9 typedef struct ArcNode//边结点 10 { 11 int adjvex; 12 str

图的广度优先搜索

图的广度优先搜索基本思想和树的层次遍历差不错.与树的层次遍历不同的是,图中可能包含回路,我们遍历完一个节点,继续进行遍历,可能会回到已经遍历过的节点.为了避免遍历一个节点两次,需要开辟一个bool型的数组来标记该节点是否已经遍历过. #include <iostream> #include <list> #include <queue> using namespace std; //This class represents a directed graph using

【数据结构】图的广度优先搜索

图的广度优先搜索(BFS)与树的广度优先搜索类似.与树不同的是,图中可能存在循环.所我们可能会再次访问到同一个节点.为了表面多次处理同一个节点,我们要布尔变量数据记录节点有没有被访问过.为了简化,我们假设所有的节点都是从根节点可达的. 比如在下图中,我们从节点2出发.当我们访问到节点0时,我们寻找所有与他相邻的节点.节点2就是与0相邻的节点,如果我们不对已访问的节点做标记,那么节点2就会被重复访问.这样的话,算法将会一直进行下去.对下图进行广度优先搜索的结果是2,0,3,1. 以下C++程序是从

【算法】图的广度优先搜索和深度优先搜索

我们构建一张如下的图: 直接上代码: package main; import java.util.ArrayList; public class Node { private String name = ""; public ArrayList<Node> neighbor = new ArrayList<>(); public boolean flag = false; public Node(String name){ this.name = name;

图的搜索算法之广度优先搜索

图的邻接表表示 对图(有向或无向)G=<V,E>(为方便记,假定V=1,2,-,n),其邻接表表示是一个由|V|个链表组成数组.对每一个u∈V,链表Adj[u]称为相应顶点u的邻接表.它包括G中全部与u相邻的顶点.每一个邻接表中顶点一般是按随意顺序存放的. 无向图的邻接表表示 有向图的邻接表表示 广度优先搜索(Broad First Search) 1.问题的理解与描写叙述 给定一个图(有向或无向)G=<V,E>和当中的一个源顶点s.广度优先搜索系统地探索G的边以"发现&

广度优先搜索(bfs)

学了将近半年的信息了,昨天猛地间发现我好像不会搜索.... 这就意味着我在noip的时候连暴力都不会打...为了避免这种事情的发生,我决定一定要好好学搜索.. 好了,废话不多说了,下面开始我们的正式话题:广度优先搜索 1.前言 广度优先搜索其实是一种用来遍历连通图的一种算法,它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名.                       貌似有的东西就真的跟徐大佬说的一样:说不清楚,只能靠自己去做题才能真正理解. 所以,如果我说的你不是很明白

矩阵图中的广度优先搜索

经常会有类似的题目,如迷宫问题,在一个矩阵图中给定出发点和目标点,每次只能上下左右移动,求到目标点的最短走法,或者说是一共有多少种走法. 思路其实很简单,深搜.广搜.相对比较而言,广度优先搜索更加实用于求最短的走法(步数) 在矩阵图中的广搜需要注意一下几点. 1.确定每步的走法:不同题的走法可能不同,每次搜索时将走法保存在数组中. 2.确定初始状态 往往注意刚开始得起点(i,j)必须把MAP(i,j)改变为 -1(或者其他的),栈中第一个元素即为初始状态 3.保存状态.这点很重要.需要用数组或者

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然