コード例 #1
0
void edgeSort(Edge arr[], int left, int right) {
      int i = left, j = right;
      Edge tmp;
      string pivot = arr[(left + right) / 2].StartVertex;

      /* partition */
      while (i <= j) {
            while (arr[i].StartVertex < pivot)
                  i++;
            while (arr[j].StartVertex > pivot)
                  j--;
            if (i <= j) {
                  tmp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = tmp;
                  i++;
                  j--;
            }
      };

      /* recursion */
      if (left < j)
            edgeSort(arr, left, j);
      if (i < right)
            edgeSort(arr, i, right);
    return;
}
コード例 #2
0
ファイル: Kruskal.cpp プロジェクト: chenhch8/arithmetic
void edgeSort(int left, int right) {
    if (left >= right) return;
    srand(unsigned(time(NULL)));
    int n = rand()%(right - left + 1) + left;
    int temp = Edge[n].w;
    ED ttp = Edge[n];
    Edge[n] = Edge[left];
    int i = left + 1, j = right;
    while (i <= j) {
        while (Edge[i].w < temp && i <= right) i++;
        while (Edge[j].w > temp && j >= left + 1) j--;
        if (i <= j) {
            ED tp = Edge[i];
            Edge[i++] = Edge[j];
            Edge[j--] = tp;
        } 
    }
    if (j >= 0) {
        Edge[left] = Edge[j];
        Edge[j] = ttp;
    }
    edgeSort(left, j - 1);
    edgeSort(j + 1, right);
    return;
}
コード例 #3
0
void edgeArrayInit(Edge RBM[], int num_edges){
    for(int i = 0; i < num_edges; i++)
    {
        string garbage;
        getline(cin, RBM[i].StartVertex, ',');//that is a comma
        getline(cin, RBM[i].EndVertex, ',');//also a comma
        cin >> RBM[i].Dweight;
        getline(cin, garbage);
    }
    edgeSort(RBM, 0, num_edges);
    return;
}
コード例 #4
0
ファイル: Kruskal.cpp プロジェクト: chenhch8/arithmetic
void Kruskal(int n) {
    edgeSort(0, n);
//for (int i = 0; i <= n; i++)
//std::cout << Edge[i].w << " " << Edge[i].x << " " << Edge[i].y << std::endl;
    int m = 0, sum_w = 0;
    while (m < n) {  ///////////////////////////////////////////////////////
        if (!Is_same(Edge[m].x, Edge[m].y)) {
            sum_w += Edge[m].w;
            std::cout << Edge[m].x << " " << Edge[m].y << std::endl;
            Union(Edge[m].x, Edge[m].y);
        }
        m++;
    }
    std::cout << "sum_w = " << sum_w << std::endl;
}