码迷,mamicode.com
首页 > 其他好文 > 详细

图的最小生成树1

时间:2017-12-10 18:30:04      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:his   als   ==   生成树   char   bool   es2017   for   oid   

技术分享图片

技术分享图片

最小生成树指的就是用最少的边让图连通且边的总长度之和最短。

要让边的长度之和最短我们可以先选择最短的边,然后选择次短的边。。。直到选择了n-1条边为止。如果我们选中的边上的两个顶点已经连通,则放弃选用这条边

Chart[] charts = new Chart[9];
int[] arr = new int[6];
private void init() {

    charts[0] = new Chart(1, 3, 11);

    charts[1] = new Chart(2, 4, 13);

    charts[2] = new Chart(3, 5, 3);

    charts[3] = new Chart(4, 5, 4);

    charts[4] = new Chart(1, 2, 6);

    charts[5] = new Chart(3, 4, 7);

    charts[6] = new Chart(0, 1, 1);

    charts[7] = new Chart(2, 3, 9);

    charts[8] = new Chart(0, 2, 2);

    for (int i = 0; i <= 5; i++) {
        arr[i] = i;
    }
}

private void quickSort(int left, int right) {

    if (left > right) {
        return;
    }

    int i, j;
    Chart temp;

    i = left;
    j = right;
    temp = charts[left];

    while (i != j) {

         while (charts[j].w >= temp.w && i < j) {
            j--;
        }

        while (charts[i].w <= temp.w && i < j) {
            i++;
        }

        if (i < j) {
            Chart t = charts[i];
            charts[i] = charts[j];
            charts[j] = t;
        }
    }

    charts[left] = charts[i];
    charts[i] = temp;

    quickSort(left, i - 1);
    quickSort(i + 1, right);
}

private int getFather(int index) {
    if (index == arr[index]) {
        return index;
    }

    return getFather(arr[index]);
}

private boolean merge(int u, int v) {
    int uFather = getFather(u);
    int vFather = getFather(v);

    if (uFather == vFather) {
        return false;
    }

    arr[vFather] = uFather;

    return true;
}

@Test
public void testSmallTree() {
    init();
    quickSort(0, 8);

    int sum = 0, count = 0;

    for (Chart c : charts) {
        System.out.println(c.w);
        if (merge(c.u, c.v)) {
            sum += c.w;
            count++;
        }

        if (count == 5) {//6个顶点需要联通,只需要有5条边
            break;
        }
    }

    System.out.println(sum);
}

private class Chart {
    int u;
    int v;
    int w;

    public Chart() {
    }

    public Chart(int u, int v, int w) {
        this.u = u;
        this.v = v;
        this.w = w;
    }
}

图的最小生成树1

标签:his   als   ==   生成树   char   bool   es2017   for   oid   

原文地址:http://www.cnblogs.com/javathinker/p/8017524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!