C++ 中无向图中的连接组件
connected components in undirected graphs in c++
我想在 c++ 中计算无向图中的组数。我正在尝试使用bfs,但没有成功。我得到了一个数字范围[L,R](或将这些范围视为顶点数),我必须找到组的数量。我该怎么做?
就像我有(输入):
1 3
2 5
6 9
输出:
2
因为有2组。
我的代码:
bool visited[MAX];
vector<int> v[MAX];
int solve(int x)
{
queue<int> q;int ans=0;
q.push(x);
if(v[x].empty())
{
ans++;
}
while(!q.empty())
{
int curr = q.front();
visited[curr] = true;
q.pop();
for(int i = 0; i < v[curr].size(); i ++)
{
if(!visited[v[curr][i]])
{
q.push(v[curr][i]);
visited[v[curr][i]] = true;
}
}
if(v[curr].empty()) ans++;
}
return ans;
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
int l,r,n,ans=0,min_,max_=0;
scanf("%d",&n);
for(int i = 0; i < n; i ++)
visited[i] = false;
for(int j=0;j<n;j++)
{
scanf("%d",&l);scanf("%d",&r);
for(int i=l;i<r;i++)
{
v[i].push_back(i+1);
min_ = min(min_,i);
max_ = max(max_,i+1);
}
}
printf("%dn",solve(min_));
}
return 0;
}
让我们来看看在最坏的情况下创建了多少条边。它是N * (MAX_R - MIN_L)
,在给定的约束下是10^5 * 2000
的。您的程序内存不足并出现运行时错误。需要更有效的算法。这是一个仅使用O(MAX_R)
内存和
O(N + MAX_R)
时间的简单解决方案。
vector<int> start(MAX_R + 1);
vector<int> end(MAX_R + 1);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int low;
int high;
cin >> low >> high;
start[low]++;
end[high]++;
}
int res = 0;
int sum = 0;
for (int pos = 0; pos <= MAX_R; pos++) {
if (sum == 0 && start[pos] > 0)
res++;
sum += start[pos] - end[pos];
}
cout << res << endl;
在这个问题中不需要bfs或任何其他图形算法。
您可以通过避免图形中的多个边来修复原始解决方案(如果已经存在,则无需创建从i
到i + 1
的边缘,但我不确定您的原始解决方案是否正确)。
看起来您应该从更改为vector<pair<int,int>> v;
开始。然后要填充v
您应该使用:
scanf("%d", &l);scanf("%d", &r);
v.push_back(make_pair(l, r);
然后你的函数应该变成这样:
int solve(){
vector<pair<int, int>> results;
for(auto& vIndex : v){
auto resultIndex = find_if(results.begin(), results.end(), [vIndex](const pair<int, int>& i){return vIndex.first >= i.first && vIndex.first <= i.second || vIndex.second >= i.first && vIndex.second <= i.second;});
if(resultIndex == results.end()){
results.push_back(vIndex);
}else{
resultIndex->first = min(vIndex.first, resultIndex->first);
resultIndex->second = max(vIndex.second, resultIndex->second);
}
}
return results.size();
}
您可以在此处看到此操作: http://ideone.com/MDQBOr 只需将所需的输入硬编码到 v
中即可。
相关文章:
- 到连接组件算法的问题(递归)
- 使用 bfs 解决连接组件问题时得到错误的答案
- 将无向连接图分解为两个组件
- 连接的组件程序产生不正确的输出
- 查找每个连接组件区域的邻域
- 根据现有的标签(而不是二进制图像)查找使用 OpenCV 连接的组件
- 如何在OpenCV中对连接组件进行分割
- OpenCV 3.4.0 中带有 cuda 的连接组件(在 GPU 上)
- 在一个DFS中查找Di-Graph中的强烈连接组件
- OpenCV 中的连接组件
- 使用带有笛卡尔点的升压连接组件
- C++ 中无向图中的连接组件
- 用于 SPOJ 底部的强连接组件
- OpenCV如何在二进制图像中查找连接组件的列表
- 连接组件算法输出
- 定义强连接组件
- C++-如何增加堆栈大小以允许Kosaraju算法进行更多递归以计算强连接组件
- DFS:如何在c++中表示连接组件的节点
- 带有STL c++ bug的强连接组件
- 图形连接和连接组件