双向BFS

跟普通BFS的区别是:双向BFS用两个队列,让起点和终点各进一队

1,创建两个队列,一个起点进队,一个终点进队

2,将两个对头的可到达节点分别入队

3,两个头节点出队

4,循环2,3如果起点队列的头节点在另一个队里进入过了,就停止

或是等到有一个队为空

#include <bits/stdc++.h>

using namespace std;

string begin = "A";
string end = "G";

void BFS(map<string,set<string>> m)
{
    set<string> check1;
    set<string> check2;
    deque<string> d1;
    deque<string> d2;
    check1.insert(::begin);
    check2.insert(::end);
    d1.push_back(::begin);
    d2.push_back(::end);
    while(!d1.empty() && !d2.empty())
    {
        string x = d1.front();
        string y = d2.front();
        if(check1.find(y) != check1.end() || check2.find(x) != check2.end()) break;
        for(auto elem1 : m[x])
        {
            if(check1.find(elem1) == check1.end())
            {
                d1.push_back(elem1);
                check1.insert(elem1);
            }
        }
        for(auto elem2 : m[y])
        {
            if(check2.find(elem2) == check2.end())
            {
                d2.push_back(elem2);
                check2.insert(elem2);
            }
        }
        d1.pop_front();
        d2.pop_front();
    }
    return;
}

int main()
{
    map<string,set<string>> m;
    for(int i = 0;i < 10;++i)
    {
        string x,y;
        cin >> x >> y;
        m[x].insert(y);
        m[y].insert(x);
    }
    BFS(m);
    return 0;
}
/*
A B
A D
A E
B D
D E
B C
E C
E F
E G
F G
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值