2014-11-18 6 views
0

나는 C++에서 크루스 칼의 알고리즘을 구축하려고를 사용하지 않는 논리에 의해 수정되고 있으며, 그것의 일부를 작성했습니다, 여기에 코드입니다 :배열이 어떻게 든 배열

#include <iostream> 
#include <fstream> 
#include <cstdio> 
#include <cstdlib> 
using namespace std; 

class Edge { 
    public: 
     int to; 
     int from; 
     int weight; 
     Edge(); 
     void print_edge(); 
}; 

Edge::Edge(void) { 
} 

void Edge::print_edge() { 
    cout << "Edge to " << to << " from " << from << " of weight " << weight << endl; 
} 

int main() { 
    int *vertex_sets; 
    int vertex_size; 
    int edge_size = 0; 

    Edge* edges = new Edge[vertex_size * (vertex_size - 1)/2]; 
    Edge* mst_edges = new Edge[vertex_size]; 

    cin >> vertex_size; 
    vertex_sets = new int[vertex_size]; 

    for (int i = 0; i < vertex_size; i++) { 
     int vertex_num; 
     cin >> vertex_num; 
     cout << "Assigning vertex set " << i << endl; 
     vertex_sets[i] = i; 
     int num_adjacent; 
     cin >> num_adjacent; 

     for (int j = 0; j < num_adjacent; j++) { 
      edges[edge_size] = Edge(); 
      edges[edge_size].from = i; 

      cin >> edges[edge_size].to >> edges[edge_size].weight; 
      edge_size++; 
     } 
     cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl; 
     cout << "Vertex " << 0 << " is in set " << vertex_sets[0] << endl; 
    } 

    cout << endl; 

    for (int i = 0; i < vertex_size; i++) { 
     cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl; 
    } 
} 

그러나 어떤 이유는 vertex_sets 어레이 제 (INT J = 0 ... 루프 동안 변화, 그리고 나는이 입력

8 
0 
2 
4 2 
5 6 
1 
1 
6 1 
2 
2 
3 2 
4 2 
3 
4 
2 2 
4 3 
6 5 
7 4 
4 
3 
0 2 
2 2 
3 3 
5 
2 
0 6 
6 2 
6 
3 
1 1 
3 5 
5 2 
7 
1 
3 4 

내가의 출력을 얻을으로., 따라서 인쇄 문을 어떻게 왜 안 확신

Assigning vertex set 0 
Vertex 0 is in set 0 
Vertex 0 is in set 0 
Assigning vertex set 1 
Vertex 1 is in set 1 
Vertex 0 is in set 0 
Assigning vertex set 2 
Vertex 2 is in set 2 
Vertex 0 is in set 0 
Assigning vertex set 3 
Vertex 3 is in set 3 
Vertex 0 is in set 3 
Assigning vertex set 4 
Vertex 4 is in set 4 
Vertex 0 is in set 3 
Assigning vertex set 5 
Vertex 5 is in set 5 
Vertex 0 is in set 3 
Assigning vertex set 6 
Vertex 6 is in set 6 
Vertex 0 is in set 3 
Assigning vertex set 7 
Vertex 7 is in set 7 
Vertex 0 is in set 3 

Vertex 0 is in set 3 
Vertex 1 is in set 2 
Vertex 2 is in set 4 
Vertex 3 is in set 3 
Vertex 4 is in set 4 
Vertex 5 is in set 5 
Vertex 6 is in set 6 
Vertex 7 is in set 7 

이것은 루프의 네 번째 반복 동안 어떤 이유로 인덱스 0의 vertex_sets 값이 0에서 3으로 변경된다는 것을 의미하며 그 이유는 알 수 없습니다. 왜 이런 일이 일어나는 지 알 수 있습니까?

+2

초기화하기 전에 'vertex_size'를 할당 크기로 3 라인으로 사용하는 것은 좋은 생각이 아닙니다. – Aesthete

+0

좋은 캐치. 그것은 문제의 일부일 수 있습니다. – aftrumpet

+0

이 코드는 g ++에서 그대로 실행되지 않습니다. 나는 'std :: bad_alloc'의 인스턴스를 던진 후에 호출을 종료하려고한다. what() : std :: bad_alloc Aborted – RPGillespie

답변

1

초기화되지 않은 변수를 사용하여 새 배열을 할당하면 시간이 많이 걸릴 수 있습니다.

Edge* edges = new Edge[vertex_size * (vertex_size - 1)/2]; 
Edge* mst_edges = new Edge[vertex_size]; 

cin >> vertex_size;