C++ 从树检测循环';无向图的s根
我想确定给定的图是否具有我想要的结构。我想要的结构是,如果给定的图的树的根形成一个循环,那么输出为true,否则为false 下面是一个示例图: 它有3棵树,根1,5,4形成一个循环 此外,这是一个不应通过的示例,因为它不包含构成循环的树的根: 如何在给定顶点的情况下确定应搜索哪些树 这是迄今为止的代码,用于打印给定图形的邻接列表C++ 从树检测循环';无向图的s根,c++,algorithm,tree,graph-theory,undirected-graph,C++,Algorithm,Tree,Graph Theory,Undirected Graph,我想确定给定的图是否具有我想要的结构。我想要的结构是,如果给定的图的树的根形成一个循环,那么输出为true,否则为false 下面是一个示例图: 它有3棵树,根1,5,4形成一个循环 此外,这是一个不应通过的示例,因为它不包含构成循环的树的根: 如何在给定顶点的情况下确定应搜索哪些树 这是迄今为止的代码,用于打印给定图形的邻接列表 #include <iostream> #include <vector> using namespace std; void ad
#include <iostream>
#include <vector>
using namespace std;
void addEdge(vector<int> vec[], int u, int v)
{
vec[u].push_back(v);
}
void printGraph(vector<int> vec[], int j)
{
cout << "Graph's adjacent list: \n";
for (int v = 0; v < j; ++v)
{
if (vec[v].size() == 0) continue;
cout << "Head(" << v << ")";
for (auto x = vec[v].begin(); x != vec[v].end(); x++)
cout << " -> " << *x;
cout << "\n" ;
}
}
int main()
{
int V = 10;
vector<int> vec[V];
addEdge(vec, 6, 3);
addEdge(vec, 7, 1);
addEdge(vec, 8, 9);
addEdge(vec, 6, 4);
addEdge(vec, 5, 1);
addEdge(vec, 1, 9);
addEdge(vec, 2, 5);
addEdge(vec, 1, 4);
addEdge(vec, 5, 4);
printGraph(vec, V);
return 0;
}
#包括
#包括
使用名称空间std;
无效加法(向量向量向量[],整数u,整数v)
{
vec[u]。推回(v);
}
void printGraph(向量向量[],int j)
{
你的问题是如何判断给定的图形
只包含一个循环
循环中的每个节点都是树的根
好消息是,假设你的图是连通的,那么如果属性(1)是真的,那么属性(2)也是真的!要了解原因,想象一下从该循环中删除任何边。现在你有一个没有循环的连通图,它是一棵树。这意味着每个节点,而不仅仅是循环中的节点,都可以被视为根
关于这一点,有一个非常好的算法,用于确定一个图是否连接并且恰好包含一个循环。首先,计算图中的边数。如果该图确实连接并且正好包含一个循环,那么边数应该正好等于节点数。(一棵树比一条边多了一个节点,并且您已经添加了一条边)。如果不是这样,那么停止-答案是否
从那里,你知道你有正确数量的节点和边。你只需要检查图是否连接,你可以通过图上的DFS或BFS来完成
这一点的好处在于,如果正确实现,运行时将为O(n),其中n是节点数,与边数无关。毕竟,如果看到的边数超过n,则可以停止搜索
希望这有帮助!您的问题是如何判断给定的图形
只包含一个循环
循环中的每个节点都是树的根
好消息是,假设你的图是连通的,那么如果属性(1)是真的,那么属性(2)也是真的!要了解原因,想象一下从该循环中删除任何边。现在你有一个没有循环的连通图,它是一棵树。这意味着每个节点,而不仅仅是循环中的节点,都可以被视为根
关于这一点,有一个非常好的算法,用于确定一个图是否连接并且恰好包含一个循环。首先,计算图中的边数。如果该图确实连接并且正好包含一个循环,那么边数应该正好等于节点数。(一棵树比一条边多了一个节点,并且您已经添加了一条边)。如果不是这样,那么停止-答案是否
从那里,你知道你有正确数量的节点和边。你只需要检查图是否连接,你可以通过图上的DFS或BFS来完成
这一点的好处在于,如果正确实现,运行时将为O(n),其中n是节点数,与边数无关。毕竟,如果看到的边数超过n,则可以停止搜索
希望这有帮助!到目前为止您尝试了什么?您是如何用代码表示图形的?我对实现图形的部分进行了编码,给出了节点和边。然后打印了图形的邻接列表。还对在图形中查找循环的部分进行了编码,但这一点都没有帮助,因为并非所有图形都具有我上面指定的结构。好的,但至少要展示你已经拥有的代码,然后描述其中的问题。确认:你想检查三角形中是否有三个节点连接在一起,从而使图形(除了这三个节点)形成一棵树?@george_pap如何在给定顶点的情况下确定应该搜索哪些树?--这有关系吗?不管是哪一棵树开始时的ch节点,如果进行深度优先搜索,您将点击循环。到目前为止,您尝试了什么?您如何用代码表示图形?我根据节点和边对实现图形的部分进行了编码。然后打印了图形的邻接列表。还对在图形中查找循环的部分进行了编码,但这一点都没有帮助,因为并不是所有的图都具有我上面指定的结构。好的,但至少要显示您已经拥有的代码,然后描述其中的问题。确认:您想检查三角形中是否有三个节点链接,以使图(除了这三个节点)形成一棵树?@george_pap在给定顶点的情况下,我如何确定哪些树是树我应该搜索吗?--这有关系吗?无论从哪个节点开始,如果进行深度优先搜索,都会进入循环。