使用 bfs 解决连接组件问题时得到错误的答案

Got wrong answer while solving connected components question using bfs

本文关键字:错误 答案 问题 bfs 解决 连接 组件 使用      更新时间:2023-10-16

你会得到一个有n个节点和m条边的图。 计算可以从图形中删除的最大边数,以便它正好包含 k 个连接的分量。

输入

第一行包含 n,m,k(按顺序(。

接下来的 m 行有 2 个数字,ui 和 vi,表明这些节点之间有一条边。 保证输入有效(没有多条边,没有循环(。

输出

可以从图形中删除的最大边数,以便它正好包含 k 个连接的组件。 如果图形最初有超过 k 个组件,则打印 -1 。

这是我的解决方案

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,k;
cin>>n>>m>>k;
vector<vector<int>>graph(n+1);
while(m--)
{
int a,b;
cin>>a>>b;
graph[a].push_back(b);
graph[b].push_back(a);
}
vector<bool>visited(n+1,false);
queue<int>q;
int connected_components=0;
int span_edges=0;
for(int i=1;i<=n;i++)
{
if(visited[i] == false)
{
visited[i]=true;
q.push(i);
while(!q.empty())
{
int top=q.front();
q.pop();
for(auto k : graph[i])
{
if(!visited[k])
{
visited[k]=true;
span_edges++;
q.push(k);
}
}
}
}
connected_components++;
}
if(k<connected_components)
{
cout<<-1<<endl;;
}
else
{
cout<<((m-span_edges)+(k-connected_components))<<endl;
}

}

我得到了令人痛苦的答案,但我认为逻辑是正确的.我对图问题不太熟悉,虽然我已经阅读了所有的图概念,有人可以帮我吗?

谢谢。

这一行for(auto k : graph[i])有一个错误 - 您需要迭代存储在top变量中的顶点边缘,而不是i