• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            A Za, A Za, Fighting...

            堅信:勤能補拙

            PKU 1861 Network/PKU 2485 Highways

            問題:
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1861
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2485

            思路:
            這里題目并沒有明確要求求最小生成樹,而是要求一顆最長邊最小的生成樹
            我們可以證明:
                   如果T是一顆最小生成樹,那么T所包含的最長邊一定是所有生成樹中最小的,即最小生成樹滿足題目要求
            Prove:
            如果T的最長邊(x, y)并非最小
            那么,存在一顆生成樹R,其最長邊(u, v)<(x, y),即生成樹R的任何一條邊都小于(x, y)
            現(xiàn)在,采用剪切-粘帖的方法來證明T不是一顆最小生成樹,即矛盾
            將T中的最長邊(x, y)剪切掉,這樣就得到兩顆子樹
            在R中,至少存在一條邊(p, q)可以將這兩顆子樹連接起來,這樣就得到:
                       T - (x, y) + (p, q) < T

            代碼(這里采用Kruskal算法,并查集實現(xiàn))
             1 /* union-find sets, Kruskal algorithm */
             2 #include<stdio.h>
             3 #include<stdlib.h>
             4 #include<string.h>
             5 #define MAX_N 1001
             6 #define MAX_M 15001
             7 struct Edge{
             8     int len;
             9     int from, to;
            10 }edges[MAX_M];
            11 int parent[MAX_N], rank[MAX_N];
            12 int n, m;
            13 
            14 void
            15 make_set()
            16 {
            17     int i;
            18     for(i=1; i<=n; i++)
            19         parent[i] = i;
            20     memset(rank, 0sizeof(rank));
            21 }
            22 
            23 int
            24 find(int x)
            25 {
            26     int tmp, rt = x;
            27     while(parent[rt] != rt)
            28         rt = parent[rt];
            29     while(x != rt) {
            30         tmp = parent[x];
            31         parent[x] = rt;
            32         x = tmp;
            33     }
            34     return rt;
            35 }
            36 
            37 void
            38 Union(int x, int y)
            39 {
            40     int a = find(x);
            41     int b = find(y);
            42     if(a == b)
            43         return;
            44     if(rank[a] > rank[b])
            45         parent[b] = a;
            46     else {
            47         parent[a] = b;
            48         if(rank[a] == rank[b])
            49             ++rank[b];
            50     }
            51 }
            52 
            53 int
            54 compare(const void *arg1, const void *arg2)
            55 {
            56     return ((struct Edge *)arg1)->len - ((struct Edge *)arg2)->len;
            57 }
            58 
            59 void
            60 init()
            61 {
            62     int i;
            63     for(i=0; i<m; i++
            64         scanf("%d %d %d"&edges[i].from, &edges[i].to, &edges[i].len);
            65     qsort(edges, m, sizeof(struct Edge), compare);
            66 }
            67 
            68 void
            69 kruskal()
            70 {
            71     int i, a, b, count = 0;
            72     int mark[MAX_N];
            73     make_set();
            74     for(i=0; i<m; i++) {
            75         a = find(edges[i].from);
            76         b = find(edges[i].to);
            77         if(a != b) {
            78             mark[count++= i;
            79             Union(a, b);
            80         }
            81     }
            82     /* output */
            83     printf("%d\n", edges[mark[count-1]].len);
            84     printf("%d\n", count);
            85     for(i=0; i<count; i++)
            86         printf("%d %d\n", edges[mark[i]].from, edges[mark[i]].to);
            87 }
            88 
            89 int
            90 main(int argc, char **argv)
            91 {
            92     while(scanf("%d %d"&n, &m) != EOF) {
            93         init();
            94         kruskal();
            95     }
            96 }


            posted on 2010-09-05 13:09 simplyzhao 閱讀(196) 評論(0)  編輯 收藏 引用 所屬分類: F_圖算法

            導航

            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            无码8090精品久久一区| 亚洲中文字幕无码久久2020| 欧美午夜A∨大片久久| 国产99久久久久久免费看| 久久影院午夜理论片无码| 亚洲第一永久AV网站久久精品男人的天堂AV| 91精品国产高清久久久久久国产嫩草| 国产综合免费精品久久久| 久久狠狠爱亚洲综合影院| 久久综合久久综合久久综合| 亚洲性久久久影院| 国产69精品久久久久99尤物| 久久久久九九精品影院| 久久99国产精品久久99| 无码精品久久久久久人妻中字 | 国产精品免费久久久久久久久 | 中文字幕无码久久精品青草| 久久香蕉国产线看观看精品yw| 蜜臀久久99精品久久久久久| 久久久久人妻精品一区二区三区| 日韩电影久久久被窝网| 久久久亚洲欧洲日产国码二区| 久久精品一区二区三区中文字幕 | 国产午夜精品理论片久久影视| 三级韩国一区久久二区综合| 久久精品国产精品国产精品污 | 色播久久人人爽人人爽人人片AV| 亚洲精品高清久久| 久久国产精品一国产精品金尊| 久久天天躁狠狠躁夜夜不卡| 日韩精品无码久久一区二区三| 青青青青久久精品国产h| 久久婷婷激情综合色综合俺也去| 国产成人综合久久精品红| 国产精品99久久久久久猫咪 | 久久久久成人精品无码中文字幕| 亚洲欧美久久久久9999| 久久婷婷五月综合97色直播| 久久人搡人人玩人妻精品首页| 欧美精品福利视频一区二区三区久久久精品 | 国产精品久久久久影院嫩草|