Program wiesza sie na push_back vectora?

0

Witam, mam dziwny problem z kodem, koduje w code blocks, wystepuje u mnie brak jakiegokolwiek bledu a debug mode pokazuje ze nic nie ma a w dodatku tworzy plik co jest dziwne bo w normalnej kompilacji zawiesza program, doszedlem do tego ze jest to wina adj[a].push_back(pair<int,int>(b,c)); -takiego czegos
Kod tutaj:

#include <iostream>
#include <fstream>
#include<vector>
#include<set>
#define N 10000
using namespace std;

vector< pair<int,int> > adj[200000];
vector<int> waga;
struct cmp
{
    bool operator() (const int &a, const int &b)
    {
        if (waga[a] < waga[b]) return true;
        else if (waga[a] > waga[b]) return false;
        else return a<b;
    }
};

void Dijkstra(int s, int n)
{
    set<int, cmp> kopiec;
    int v, u, c;
    waga.clear();
    waga.resize(n, N);
    waga[s] = 0;
    for (int i=0; i<=n; i++) kopiec.insert(i);
    while( !kopiec.empty() )
    {
        u = *(kopiec.begin());
        kopiec.erase(kopiec.begin());
        for (int i=0; i<adj[u].size(); i++)
        {
            v = adj[u][i].first;
            c = adj[u][i].second;
            if (waga[u]+c < waga[v])
            {
                kopiec.erase(kopiec.find(v));
                waga[v] = waga[u]+c;
                kopiec.insert(v);
            }
        }
    }
}

int main()
{
    int n=0,m=0,x=0,tmp=0,txp=0,i=-1;
    int **tab, *t;
    vector<int> basic;
    //
    //
    ifstream liczby("in.txt");
    while (!liczby.eof()) {
        if(n==0) liczby >> n;
        else if(m==0) liczby >> m;
        else if(x==0) { liczby >> x; t = new int[x]; }
        else {
            if(txp<m)
            {
                int a,b,c;
                if(tmp==0) { liczby >> a; tmp=1;}
                else if(tmp==1) { liczby >> b; tmp=2;}
                else if(tmp==2) { liczby >> c; tmp=3;}
                if(tmp==3) {
                    //adj[a].push_back(pair<int,int>(b,c));
                    //adj[b].push_back(pair<int,int>(a,c));
                    tmp=0;
                    txp++;
                }
            }
            else {
                if(i==-1) { i++; tab = new int*[x]; for(int i=0; i<x; i++) tab[i] = new int[2]; tmp=0; }
                liczby >> tab[i][tmp];
                tmp++;
                if(tmp==3) { i++; tmp=0;}
            }
        }
    }
    liczby.close();
    //
    //
    Dijkstra(1, n);
    basic=waga;
    for(int i=0;i<x;i++)
    {
        t[i]=0;
        //adj[tab[i][0]].push_back(pair<int,int>(tab[i][1],tab[i][2]));
        //adj[tab[i][1]].push_back(pair<int,int>(tab[i][0],tab[i][2]));
        Dijkstra(1,n);
        for(int j=1;j<=n;j++)
        {
            if(waga[j]<basic[j] && t[i] <= 100) t[i]+=1;
        }
        //adj[tab[i][0]].pop_back();
        //adj[tab[i][1]].pop_back();
    }
    //
    //
    ofstream out("out.txt");
    for(int i=0;i<x;i++) {
    if(t[i]==101) out << "100+" << endl;
    else out << t[i] << endl;
    }
    return 1;
}

Plik wejsciowy in.txt mam taki:

6 10 5
2 3 27
2 4 93
3 6 99
4 6 81
4 5 37
1 6 39
1 2 83
5 6 1
1 5 96
3 4 23
2 6 5
2 6 18
2 5 43
3 5 37
1 3 3

To co zakomentowane to te linie ktore mi powodują wieszanie programu. Szukam po necie informacji czym to moze byc spowodowane i nie mam pojecia. Jesli ktos wie o co w ogole chodzi ze ten program sie zacina niech pomoże. Będę wdzięczny!

0

Gdzieś mażesz po pamięci i tyle.

0

Probojac na czysto wbic adj[0].push_back(pair<int,int>(0,0))
juz mnie wywala , vector ma duzy zasieg wiec jakim cudem moge gdzies wyjsc.

0

Obstawiałbym że tu: liczby >> tab[i][tmp]; ale nie koniecznie.
Zacznij od zmiany tej twojej i na jakąś przyzwoitą nazwę, ponieważ i używasz w pętlach.
Owszem teoretycznie kompilator powinien sobie z tym poradzić, ale ponieważ nikt o zdrowym rozsądku tak nie robi to w tym może tkwić dotychczas nie odkryty bug kompilatora.

0

Powinien i radzi sobie, poniewaz jedynie potem korzystam lokalnie w for z wlasnego i, no ale zmienilem, to nie to, nadal to samo.
Jak dla mnie to cos z tym wektorem gdzie pary sa jest nie tak ale nie moge sie doszukac.

0

Z drugiej strony... hmm.
I dziwo czasem jak robie cout w miejscu z tym tab[k][tmp] to "czasem" wykrzacza sie tam?

0

Bo to na 100% w tym miejscu masz mazanie po pamięci.
przydzielasz: tab[i]=new int[2]; czyli dla tab[i][0] oraz tab[i][1] zaś później odwołujesz się do tab[i][tmp]; gdzie tmp zmienia się w zakresie 0..2

0

Ale gafa :O Przechowuje tam dane x y i z a mam tablice na 2 tylko, dzieki, juz dziala wszystko ;)

0

Widzę, że problem już rozwiązany, ale jak dla mnie bardzo dziwnie odczytujesz te dane. Wystarczy:

ifstream liczby("in.txt");
    liczby >> n >> m >> x;
    t = new int[x];
    for(txp = 0; txp < m; ++txp)
    {
        int a,b,c;
        liczby >> a >> b >> c;
        adj[a].push_back(pair<int,int>(b,c));
        adj[b].push_back(pair<int,int>(a,c));

    }
    tab = new int*[x];
    for(int i=0; i<x; i++)
    {
        tab[i] = new int[2];
        liczby >> tab[i][0] >> tab[i][1] >> tab[i][2];
    }
    liczby.close(); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1