我很难理解BFS算法时间复杂度的一个要素。
对于无向图,我的教授说每条边(u,v)遍历两次。从u
的方向开始,从v
的方向开始一次。因此,找到与至少一个顶点相邻的所有未标记顶点的步骤是O(| E |)。
有人可以解释如何在有向图中遍历每条边,在无向图中遍历两次吗?我想,对于BFS,我们只是从根顶点向外走?第二次遍历来自哪里?
答案 0 :(得分:1)
假设您正在使用邻接列表来存储图表。
#include <fstream>
#include <vector>
#include <iterator>
MainPage::MainPage()
{
InitializeComponent();
std::ifstream input("Assets\\StoreLogo.png", std::ios::binary);
std::vector<char> data((std::istreambuf_iterator<char>(input)), (std::istreambuf_iterator<char>()));
// I just obtained a pointer to the image data through data.data()
auto bitmapImage = ref new BitmapImage();
image->Source = bitmapImage;
auto stream = ref new InMemoryRandomAccessStream();
auto writer = ref new DataWriter(stream->GetOutputStreamAt(0));
writer->WriteBytes(ArrayReference<unsigned char>((unsigned char*)data.data(), data.size()));
create_task(writer->StoreAsync()).then([=](unsigned bytesStored)
{
return bitmapImage->SetSourceAsync(stream);
});
}
在无向图中 v 和 u 在彼此的邻接列表中。因此,在第16行,当我们检查相邻节点时,当前节点是 u 时,我们检查相邻节点 v 并且当前节点是 u 我们检查相邻节点 v 。但这并不意味着我们再次在队列中推送 v 。我们只是检查它。
但是,在无向图中,只有 v 位于 u 的邻接列表中。因此每个边缘 u-> v 都会被检查一次。
我认为你的教授意味着我们检查每个边缘两次而不是遍历。