BK Algorithm Club
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.


BK Algorithm Practice Forum
 
Trang ChínhTrang Chính  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  

 

 Heap Spanning Tree

Go down 
2 posters
Tác giảThông điệp
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

Heap Spanning Tree Empty
Bài gửiTiêu đề: Heap Spanning Tree   Heap Spanning Tree I_icon_minitime04.12.08 0:01

lỡ làm Heap rồi, thôi thì quất lun đi cho đủ bộ.
thấy có bài về Heap nữa, mọi người thử xem

2786. Cây khung nhỏ nhất ( HEAP )
Mã bài: QBMST

Cho đơn đồ thị vô hướng liên thông G = (V, E) gồm n đỉnh và m cạnh, các đỉnh được đánh số từ 1 tới n và các cạnh được đánh số từ 1 tới m. Hãy tìm cây khung nhỏ nhất của đồ thị G
Input

Dòng 1: Chứa hai số n, m (1 <= n <= 10000; 1 <= m <= 15000)

M dòng tiếp theo, dòng thứ i có dạng ba số nguyên u, v, c. Trong đó (u, v) là chỉ số hai đỉnh đầu mút của cạnh thứ i và c trọng số của cạnh đó (1 <= u, v <= n; 0 <= c <= 10000).
Output

Gồm 1 dòng duy nhất: Ghi trọng số cây khung nhỏ nhất
Example
Input:
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2

Output:
5


http://vnoi.info/index.php?option=com_voj&task=viewStatement&problem=QBMST
Về Đầu Trang Go down
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

Heap Spanning Tree Empty
Bài gửiTiêu đề: Re: Heap Spanning Tree   Heap Spanning Tree I_icon_minitime04.12.08 19:37

thấy có Thi (bt09) AC rồi, không biết có ai làm nữa không?
mà sao đặc điểm trên vn.SPOJ hình như top score luôn thuộc về PAS thì phải Sad
Phải làm gì đó đi chứ.

--

04-12-2008 đã spam và giành lại vị trí độc tôn cho C++ với 0.07s rabbit
Về Đầu Trang Go down
anhdung
bắt đầu sự nghiệp đi học
bắt đầu sự nghiệp đi học
anhdung


Tổng số bài gửi : 26
Join date : 25/11/2008
Age : 35

Heap Spanning Tree Empty
Bài gửiTiêu đề: Re: Heap Spanning Tree   Heap Spanning Tree I_icon_minitime07.12.08 23:29

Code:

//MST (minimum spanning tree)
#include <stdio.h>
#include <iostream>
#define maxN 10001
#define maxE 15001
using namespace std;

int n, m;
int c[maxE][2];
int w[maxE];
int tree[maxN];
long long trso;

void DownHeap(int k) {
    int i, t1, t2;
    int x;
   
    x = w[k];
    t1 = c[k][0];  t2 = c[k][1];

    while (k <= m/2) {
          i = k<<1;
          if (i<m)
              if (w[i] > w[i+1]) i++;
          if (x <= w[i]) break;
          w[k] = w[i];
          c[k][0] = c[i][0];  c[k][1] = c[i][1];
          k = i;
    }
    w[k] = x;
    c[k][0] = t1;  c[k][1] = t2;
}

void ghep(int u, int v) {
    int i, tmp;
    trso += w[1];
    tmp = tree[v];
    for (i=1; i<=n; i++)
        if (tree[i]==tmp) tree[i] = tree[u];
}

int XayDung() {
    int i, sc, u, v;
    for (i=1; i<=n; i++) tree[i] = i;
    for (i=m/2; i>=1; i--) DownHeap(i);
   
    sc = 1;
    do {
        if (tree[c[1][0]] != tree[c[1][1]])
        {
            ghep(c[1][0], c[1][1]);
            sc += 1;
            if (sc==n) return 1;
        }
       
        //to chuc lai heap
        c[1][0] = c[m][0];  c[1][1] = c[m][1];
        w[1] = w[m];
        m--;
        DownHeap(1);
    } while (sc<n);
}

int main() {
    int x, y, d;
     
    scanf("%d%d", &n, &m);
    for (int i=1; i<=m; i++)
    {
        scanf("%d%d%d", &c[i][0], &c[i][1], &w[i]);
    }
    trso = 0;
    XayDung();
    printf("%lld\n", trso);
    //system("PAUSE");
}       



á á, a Thuận làm Heap của STL hay sao mà đc 0.07s? up code lên cho xem với Razz

cái đoạn code trên của e là code mà e trung thành từ trước tới nay (dĩ nhiên là đúng mới trung thành ^^ ) mà nó chạy đên 1.26s
Về Đầu Trang Go down
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

Heap Spanning Tree Empty
Bài gửiTiêu đề: Re: Heap Spanning Tree   Heap Spanning Tree I_icon_minitime07.12.08 23:43

STL code ngắn, thấy tốc độ nó khá nhanh.

Bài này nhập nhiều nên dùng code nhập chôm bên Input đó, chạy cho nhanh

Dũng log vô lấy về đi

https://vn.spoj.pl/status/QBMST,hcmut/

tư tưởng chính như sau:

Code:
D[0] = 0;
    Q.push(ii(0,0));
    i = 0;
    while (i<N) {
        // fetch the nearest element
        top = Q.top();
        Q.pop();
        // v is vertex index, w is the distance
        v = top.second;
      w = top.first;
      
        if (w <= D[v]) {
            D[v] = 0;
            TONG += w;
            i++;
           
            // iterate through all outcoming edges from v
            for (it = G[v].begin(); it != G[v].end(); it++){
                v2 = it->second;
            cost = it->first;
                if(D[v2] > cost) {
                    // update distance if possible
                    D[v2] = cost;
                    // add the vertex to queue
                    Q.push(ii(D[v2],v2));
                }
            }
        }
    }
Về Đầu Trang Go down
Sponsored content





Heap Spanning Tree Empty
Bài gửiTiêu đề: Re: Heap Spanning Tree   Heap Spanning Tree I_icon_minitime

Về Đầu Trang Go down
 
Heap Spanning Tree
Về Đầu Trang 
Trang 1 trong tổng số 1 trang
 Similar topics
-
» Heap Dijkstra
» Hàng đợi có độ ưu tiên (HEAP)

Permissions in this forum:Bạn không có quyền trả lời bài viết
BK Algorithm Club :: Thuật toán :: Đồ thị-
Chuyển đến