• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z seg.fault

0 głosów
326 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez Toady2004 Nowicjusz (160 p.)

Dzień dobry.

Mam pewien kod i tak jak w temacie spradzaczka pokazuje mi seg.fault.

 

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int xd;

main()
{
    char macierz[10007][10007];
    int maks=0,n,m,a,b;
    vector <int> tab[100000];
    for(int i=0; i<10000;i++){
        for(int j=0;j<10000;j++){
            macierz[i][j]=0;}

    }
    cin>>n>>m;
    for(int z=0;z<m;z++)
    {
        cin>>a>>b;

        macierz[a-1][b-1]=1;
        macierz[b-1][a-1]=1;
        tab[a].push_back(b);
        tab[b].push_back(a);
        if(a>maks)
        {
            maks=a;
        }
        if(b>maks)
        {
            maks=b;
        }
    }
    cout << endl;
    cout<<"Macierz:"<<endl;
    for(int i=0;i<maks;i++)
    {
        for(int j=0;j<maks;j++)
        {
            cout<<static_cast<int>(macierz[i][j])<< " ";
        }
        cout<<endl;
    }

    cout<<endl;
    cout<<"Lista;"<<endl;
    for (int i=1;i<=n;i++)
    {
        sort(tab[i].begin(),tab[i].end());
        cout <<i<<":"<<" ";
        for (int x=0; x<tab[i].size(); x++)
        {
            if(tab[i][x]==tab[i][x+1])
            {
                i=i;
            }
            else
                cout<<tab[i][x]<<" ";
        }
        cout<<endl;
    }

}

Dlaczego?

 

komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,040 p.)
Gdzieś wychodzisz poza zakres tablic. Podaj treść zadania, bo wydaje mi się, że da się to zrobić czytelniej.
1
komentarz 21 kwietnia 2020 przez tangarr Mędrzec (155,140 p.)

@Toady2004,
Tworzysz na stosie tablicę o rozmiarze około 95MB!!!
Tworzysz worzysz na stosie 100 tysięcy wektorów!!!

komentarz 21 kwietnia 2020 przez Toady2004 Nowicjusz (160 p.)

@tkz,

Dany jest graf nieskierowany. Wypisz jego reprezentację macierzową i listową.

Uwaga: w grafie na wejściu mogą wystąpić pętle oraz krawędzie wielokrotne. Krawędzie wielokrotne traktujemy jako jedną krawędź.

Wejście

W pierwszym wierszu dane są dwie liczby: nm (1 ≤ n ≤ 1000, 0 ≤ m ≤ 100000), gdzie n oznacza liczbę wierzchołków zaś m – liczbę krawędzi. W następnych m wierszach podane są po dwie liczby: ab (1 ≤ ab ≤ n) oznaczające krawędź między wierzchołkami a i b.

Wyjście

Wypisz reprezentację macierzową i listową danego grafu (zob. przykład).

W pierwszym wierszu należy wypisać napis "Macierz:", a w następnych n wierszach macierz sąsiedztwa danego grafu (bez spacji). W macierzy tej jedynka na pozycji ij oznacza, że istnieje krawędź między wierzchołkami i oraz j.

Dalej należy wypisać napis "Lista:", a w następnych n wierszach listy sąsiedztwa kolejnych wierzchołków. W i-tym wierszu należy wypisać najpierw "i: ", a dalej numery wierzchołków połączonych krawędzią z i-tym wierzchołkiem. Numery wierzchołków należy podać bez powtórzeń, w porządku rosnącym, oddzielając je pojedynczą spacją.

Przykład

Dla danych wejściowych

7 12
1 2
1 4
2 3
3 4
3 2
4 5
4 6
4 7
7 7
5 6
5 7
6 7

poprawną odpowiedzią jest

Macierz:
0101000
1010000
0101000
1010111
0001011
0001101
0001111

Lista:
1: 2 4
2: 1 3
3: 2 4
4: 1 3 5 6 7
5: 4 6 7
6: 4 5 7
7: 4 5 6 7

 

komentarz 23 kwietnia 2020 przez tkz Nałogowiec (42,040 p.)
#include <iostream>
#include <cstddef>
#include <utility>
#include <map>
#include <set>
#include <ostream>
#include <algorithm>

std::map<unsigned, std::set<unsigned>> edgesBetweenVertices;
void input(const unsigned &firstVertices, const unsigned &secondVertices);
void printMatrix(std::ostream &os);
void printList(std::ostream &os);

int main(void)
{
    for (size_t edge{0}; edge < 12; ++edge)
    {
        unsigned firstVertice;
        unsigned secondVertice;
        std::cin >> firstVertice >> secondVertice;
        input(firstVertice, secondVertice);
    }
    printMatrix(std::cout);
    printList(std::cout);
    return 0;
}

void input(const unsigned &firstVertices,
             const unsigned &secondVertices)
{
    edgesBetweenVertices[firstVertices].insert(secondVertices);
    edgesBetweenVertices[secondVertices].insert(firstVertices);
}

void printMatrix(std::ostream &os)
{
    os << "Macierz: "<< '\n';
    for (const auto &[mainVertice, linksWithMainVertices] : ::edgesBetweenVertices)
    {
        for (const auto &_ : edgesBetweenVertices)
        {
            if (linksWithMainVertices.find(_.first) != linksWithMainVertices.end())
            {
                os << "1 ";
            }
            else
            {
                os << "0 ";
            }
        }
        os << '\n';
    }
}

void printList(std::ostream &os)
{
    os << "Lista: "<< '\n';
    for (const auto& [vertice, edgeWith] : edgesBetweenVertices)
    {
        os << vertice << ": ";
        for (const auto& edge : edgeWith)
            os << edge << ' ';
        os << '\n';
    }
}

Dopiero dzisiaj mogłem się tym zająć. Myślę, że jest okey, no może oprócz globalnej mapy, ale nie chciało mi się jej wysyłać do funkcji. 

Jeszcze dodam, że użyłem set'a i map'y bynajmniej nieprzypadkowo, chciałem zachować posortowane wyniki. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 423 wizyt
0 głosów
1 odpowiedź 313 wizyt
0 głosów
0 odpowiedzi 539 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez Michał Gibas Pasjonat (19,630 p.)

93,742 zapytań

142,678 odpowiedzi

323,299 komentarzy

63,326 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...