【发布时间】:2020-07-05 11:32:30
【问题描述】:
给定一个包含 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;
}
}
我得到了错误的答案,但我认为逻辑是正确的。我对图形问题不太熟悉,虽然我已经阅读了所有图形概念,有人可以帮助我吗?
谢谢。
【问题讨论】:
-
没有看到输入很难确定,但我猜
vector<vector<int>>graph(n);需要是vector<vector<int>>graph(n + 1);,因为您的节点似乎从 1 到 n 编号。 -
这里是输入 4 3 2 1 2 2 3 1 3 ,我做了你提到的改变,但现在它给出了 SIGSEGV 错误
-
为什么有
t,问题陈述中没有提到? -
抱歉这个错误我已经更新了代码但是我得到了错误的答案我无法弄清楚我哪里出错了..谢谢。
标签: c++ data-structures graph breadth-first-search