Вам дан граф с 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. - person john   schedule 05.07.2020t
, который не упоминается в формулировке проблемы? - person Davis Herring   schedule 05.07.2020