首页 > 其他 > 详细

合并石子(哈夫曼方法)

时间:2014-02-21 08:26:56      阅读:363      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
//哈夫曼(最优二叉树)方法 建树//非指针做法//数据如果很大的话,有可能会超时
#include <iostream>
#define maxn 10000+10000+3
using namespace std;
class T {
public:
    int data,parent,left,right;
}tree[maxn];
int f[maxn] = {0};
int search (int k) {
    int min1 = 99999999;
    int pos;
    for (int i = 0;i<k;i++) {
        if (!f[i] && tree[i].data < min1) {
            min1 = tree[i].data;
            pos = i;
        }
    }
    f[pos] = 1;
    return pos;
}
void Huffman(int n) {
    for (int k = n;k<2*n-1;k++) {
        int pos1 = search (k); tree[pos1].parent = k;tree[k].left = pos1;
        int pos2 = search (k); tree[pos2].parent = k;tree[k].right = pos2;
        tree[k].data = tree[pos1].data + tree[pos2].data;
    }
}
int main () {
    int n;
    cin >> n;
    for (int i=0; i<n;i++) {
        cin >> tree[i].data;
    }
    Huffman(n);
    long long sum = 0;
    for (int i=n;i<2*n-1;i++) {
        sum += tree[i].data;
    }
    cout << sum << endl;
}



//哈夫曼(最有二叉树)非建树的方法//比较优化
#include <iostream>
#define maxn 10005
using namespace std;
int main () {
    int n;
    int ans = 0;
    int a[maxn];
    cin >> n;
    for (int i=0;i<n;i++) {
        cin >> a[i];
    }
    int pos1,pos2;
    while (n>1) {
        int min1 = 999999999;
        for (int i=0;i<n;i++) {
            if (a[i]<min1) {
                pos1 = i;
                min1 = a[i];
            }
        }
        int min2 = 999999999;
        for (int i=0;i<n;i++) {
            if (a[i]<min2 && i != pos1) {
                pos2 = i;
                min2 = a[i];
            }
        }
        a[pos1] = min1 + min2;
        ans += a[pos1];
        a[pos2] = a[n-1];
        n--;
    }
    cout << ans << endl;
}
bubuko.com,布布扣

合并石子(哈夫曼方法)

原文:http://www.cnblogs.com/xiaoshanshan/p/3558260.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!