C++ 用BFS确定节点的级别

C++ 用BFS确定节点的级别,c++,stl,graph-theory,breadth-first-search,C++,Stl,Graph Theory,Breadth First Search,我想打印最后一个节点的级别。 我是STL和图论的新手,所以请帮助我找出图的最后一个节点的级别。可能算法正确,但STL中的向量仍然存在一些问题,并建议我如何打印最后一个节点的级别 这是我的密码: //执行I/O的示例代码: #include<bits/stdc++.h> using namespace std; int N,M; vector <int> adj[100]; bool visited[100]; vector <int> level[100];

我想打印最后一个节点的级别。 我是STL和图论的新手,所以请帮助我找出图的最后一个节点的级别。可能算法正确,但STL中的向量仍然存在一些问题,并建议我如何打印最后一个节点的级别

这是我的密码:

//执行I/O的示例代码:

#include<bits/stdc++.h>
using namespace std;

int N,M;
vector <int> adj[100];
bool visited[100];
vector <int> level[100];

void initialize();


int main() {

    cin>>N>>M;
    int x,y;
    while(M--)
    {
        cin>>x>>y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    initialize();
    for(int i=0;i<N;i++)
    {
        if(visited[i] == false)
        {
                list <int> q;
                q.push_back(i);
                while(!q.empty())
                {
                    int p=q.front();
                    q.pop_front();
                    for(int j=0;j<adj[p].size();j++)
                    {
                        if(visited[adj[p][j]] == false)
                        {
                            level[adj[p][j]] = level[adj[p]] + 1;
                            q.push_back(adj[p][j]);
                            visited[adj[p][j]] == true;
                        }
                    }

                }
        }
    }           


}
void initialize()
{
    for(int i=0;i<N;i++)
        visited[i]=false;
}
#包括
使用名称空间std;
int N,M;
向量adj[100];
布尔访问了[100];
向量级[100];
void初始化();
int main(){
cin>>N>>M;
int x,y;
而(M--)
{
cin>>x>>y;
调整[x]。向后推(y);
形容词[y]。推回(x);
}
初始化();

对于(int i=0;i好的,老实说,我不确定你想用这段代码实现什么。我猜“level”是指节点的深度。首先,一点理论:

1) 节点的深度/级别取决于起始节点。您不能只从任何节点开始,因为结果可能会有所不同。在您的情况下,我怀疑起始节点为1(或0)。但在您的代码中,您假设您的图形可能不只包含一个连接的组件(节点a和B可能未连接).我不确定你是认真的还是在互联网上找到了一个适用于多个连接组件的bfs代码

2) 节点的深度是树中的一个术语,而不是图(因为循环)

3) 好的,“最后一个节点”是什么?真的,它是您最后访问的节点还是上面有数字n的节点?也许您指的是最深的节点

我假设你想在你的树中找到最大的深度,然后你就可以使用BFS或DFS了

现在让我们转到您的代码:

1) 如果您使用的是“级别”数组,则不需要访问的数组。级别等于0的节点尚未访问,因此您可以通过删除访问的数组来减少使用的内存

2) 对于BFS,我使用队列而不是列表,它稍微快一点

3) 你忘了在[adj[p]级写[j](错了,是我的错,你应该改为[p]级)

仅此而已,忽略警告

编辑:
顺便说一句,我想你正在尝试在一些网站上做一些图形任务。对你的I/O要小心。Cin和cout通常比printf和scanf慢得多,并且可能会导致你的代码超过时间限制错误(如果你喜欢使用Cin和cout,你可以写一行'ios_base::sync_with_stdio(0);Cin.tie(0);cout.tie(0)+1;
你没有遗漏什么吗?不..我不明白..而且你在
访问[adj[p][j]==true;
中有一个打字错误;非常肯定那应该是
访问[adj[p][j]=true;
嘿!这是第三条信息!酷!我不能写level[adj[p][j]]它会改变整个逻辑…level adj[p][j]=level adj[p]]+1意味着它会将父节点p的每个子节点[p][j]的级别提高1是的,是的,我的错,请尝试级别[p],这就是父节点的级别,并且一定要检查访问的[adj[p][j]==true;,您希望它是级别[adj[p][j]=true;