您将获得一个具有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
中的顶点的边缘。
关于c++ - 使用BFS解决连接组件问题时得到错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62740103/