Получил неверный ответ при решении вопроса о подключенных компонентах с помощью bfs

Вам дан граф с 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;
        }
    
}

Я получил резкий ответ, но думаю, что логика верна. Я не очень хорошо знаком с проблемами графов, хотя я прочитал все концепции графов, может кто-нибудь мне помочь?

Спасибо.


person Chaitanya Gujarathi    schedule 05.07.2020    source источник
comment
Не видя ввода, трудно быть уверенным, но я предполагаю, что vector<vector<int>>graph(n); должно быть vector<vector<int>>graph(n + 1);, поскольку кажется, что ваши узлы пронумерованы от 1 до n.   -  person john    schedule 05.07.2020
comment
вот ввод 4 3 2 1 2 2 3 1 3, я внес изменения, как вы упомянули, но теперь он дает ошибку SIGSEGV   -  person Chaitanya Gujarathi    schedule 05.07.2020
comment
вот ссылка на проблему (hackerearth.com/practice/algorithms/graphs/graph-presentation/)   -  person Chaitanya Gujarathi    schedule 05.07.2020
comment
Почему у вас t, который не упоминается в формулировке проблемы?   -  person Davis Herring    schedule 05.07.2020
comment
Извините за эту ошибку. Я обновил код, но получаю неправильный ответ. Я не могу понять, где я ошибся. Спасибо.   -  person Chaitanya Gujarathi    schedule 05.07.2020
comment
Почему мне не следует #include ‹bits / stdc ++. h›?   -  person rsjaffe    schedule 05.07.2020


Ответы (1)


Ошибка в этой строке for(auto k : graph[i]) - вам нужно перебирать ребра вершины, хранящейся в переменной top, а не i.

person Igor    schedule 05.07.2020