我如何在图中找到双分量?被称为块
How can i find bicomponents in graph ? called block
这是我的尝试,和复制粘贴。但我必须写找到双连接组件(称为块)?
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("test3.txt");
ofstream cout ("output.txt");
const int l = 6;
int G[l][l];
int MAXN;
int used[l];
int number[l], low[l], counter = 1, kids = 0;
vector <int> block[l];
void BiComp(int curr, int prev) {
int kids = 0;
low[curr] = number[curr] = counter++;
used[curr] = 1;
for(int i = 0; i < MAXN; i++) {
if(G[curr][i] == 1) {
if (i != prev) {
if (used[i] == 0) {
kids++;
block[0].push_back(curr);
block[0].push_back(i);
BiComp(i, curr);
low[curr] = min(low[curr], low[i]);
if(low[i] >= number[curr] && (prev != -1 || kids >= 2)) {
cout << "tochka " << curr + 1 << endl;
}
} else {
block[0].push_back(i);
block[0].push_back(prev);
cout<<block<<endl;
low[curr] = min(low[curr], number[i]);
}
}
}
}
}
void main()
{
MAXN = 6;
for (int i = 0; i < MAXN; i++)
{
for (int j = 0; j < MAXN; j++)
{
cin >> G[i][j];
cout << G[i][j] << " ";
}
cout << endl;
}
//for (int i = 0; i < MAXN; i++) {
//if (number[i] == 0) {
BiComp(0, -1);
//}
//}
}
我怎么能找到这个代码,找到切点在同一时间块??在图论中,一个双连通分量(或2连通分量)是一个极大双连通子图。
好吧,我想到的是一个非常野蛮的方法,它不会很好地扩展,但我也记得读到过,找到双连接组件实际上是一个很难的问题,计算,所以让我们从它开始,然后看看是否有优化要做。
给定一个N个节点的集合,检查每个可能的节点子集是否构成一个双连通组件。通常,你想要最大的可用组件,所以从整个图开始,然后是所有N-1个节点的子图,N-2,以此类推。一旦你找到一个解决方案,你就知道你已经找到了一个最大的可能尺寸,你可以。最坏情况下,你还是要检查2^N个子图。因此,从构建要测试的图形的循环开始。
为了确定有K个节点的给定图是否为双连通分量,循环遍历所有K*(K-1)/2对节点,并找出它们之间是否有两条独立的路径。
为了确定两个节点i和j是否双连通,首先要找出它们之间的所有路径。对于每条路径,找出是否存在到该路径的替代连接。如果你找到了,那对就玩完了。如果不是,你已经找到了证据,证明你正在看的图不是双连通的,你可以打破所有的循环,除了外面的一个,测试下一个图。
为了查看i和j之间是否存在另一种连接,取出第一条路径中使用的所有边,看看是否能找到另一条。如果可以,则可以使用i和j。如果不能,则继续使用找到的初始路径列表中的下一个路径。如果你到达路径列表的末端,但在取出相关边时没有找到另一个存在的路径,那么这两个节点就不是双连接的,因此整个图就不是。
有一个线性运行时算法,用于使用深度优先搜索在给定图中找到所有切点(或切点顶点或连接点)。
一旦你找到了所有的切点,就很容易找到所有的双组分。
- 为什么当"::"的行为不像运算符时被称为'scope resolution operator'?
- 为什么C++被称为语言联盟?
- 这应该被称为互斥锁吗?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 复制ctor被称为而不是移动ctor-可以编译器发出警告
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- 私有非虚拟基类函数被称为派生类中的函数
- 为什么在使用对象作为多映射中的键时,驱动器被称为远远不够
- 持续的指示持续的指针被称为
- 多次被称为驱动器
- 为什么SelectObject被称为两次
- 为什么Qwizard :: NextID()被称为两次
- C++对象声明被称为抽象
- 为什么击改变人被称为两次
- 特定的位数可以被称为标志吗
- 为什么委托或闭包通常被称为真正的"object-oriented function pointers"?
- 为什么它被称为重叠I/O
- 这个C++14构造被称为什么,它似乎链接了lambdas
- 我如何在图中找到双分量?被称为块
- CoInitialize()在c++中没有被称为异常