亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解次小生成樹以及相關的C++求解方法

2020-01-26 14:59:46
字體:
來源:轉載
供稿:網友

次小生成樹的定義
設 G=(V,E,w)是連通的無向圖,T 是圖G 的一個最小生成樹。如果有另一棵樹T1,滿
足不存在樹T',ω(T')<ω(T1) ,則稱T1是圖G的次小生成樹。

求解次小生成樹的算法
約定:由T 進行一次可行交換得到的新的生成樹所組成的集合,稱為樹T的鄰集,記為N(T)。
定理 3:設T是圖G的最小生成樹,如果T1滿足ω(T1)=min{ω(T')| T'∈N(T)},則T1是G
的次小生成樹。
證明:如果 T1 不是G 的次小生成樹,那么必定存在另一個生成樹T',T'=T 使得
ω(T)≤ω(T')<ω(T1),由T1的定義式知T不屬于N(T),則
E(T')/E(T)={a1,a2
1,……,at},E(T)/E(T')={b1,b2,……,bt},其中t≥2。根據引理1 知,存在一
個排列bi1,bi2,……,bit,使得T+aj-bij仍然是G 的生成樹,且均屬于N(T),所以ω(aj)≥ω(bij),
所以ω(T')≥ω(T+aj-bij)≥ω(T1),故矛盾。所以T1是圖G 的次小生成樹。
通過上述定理,我們就有了解決次小生成樹問題的基本思路。
首先先求該圖的最小生成樹T。時間復雜度O(Vlog2V+E)
然后,求T的鄰集中權值和最小的生成樹,即圖G 的次小生成樹。
如果只是簡單的枚舉,復雜度很高。首先枚舉兩條邊的復雜度是O(VE),再判斷該交換是否
可行的復雜度是O(V),則總的時間復雜度是O(V2E)。這樣的算法顯得很盲目。經過簡單的
分析不難發現,每加入一條不在樹上的邊,總能形成一個環,只有刪去環上的一條邊,才能
保證交換后仍然是生成樹,而刪去邊的權值越大,新得到的生成樹的權值和越小。我們可以
以此將復雜度降為O(VE)。這已經前進了一大步,但仍不夠好。
回顧上一個模型――最小度限制生成樹,我們也曾面臨過類似的問題,并且最終采用動態規
劃的方法避免了重復計算,使得復雜度大大降低。對于本題,我們可以采用類似的思想。首
先做一步預處理,求出樹上每兩個結點之間的路徑上的權值最大的邊,然后,枚舉圖中不在
樹上的邊,有了剛才的預處理,我們就可以用O(1)的時間得到形成的環上的權值最大的邊。
如何預處理呢?因為這是一棵樹,所以并不需要什么高深的算法,只要簡單的BFS 即可。
預處理所要的時間復雜度為O(V2)。
這樣,這一步時間復雜度降為O(V2)。
綜上所述,次小生成樹的時間復雜度為O(V2)。

練習
題目:

    題目描述: 
    最小生成樹大家都已經很了解,次小生成樹就是圖中構成的樹的權值和第二小的樹,此值也可能等于最小生成樹的權值和,你的任務就是設計一個算法計算圖的最小生成樹。 
    輸入: 
    存在多組數據,第一行一個正整數t,表示有t組數據。 
    每組數據第一行有兩個整數n和m(2<=n<=100),之后m行,每行三個正整數s,e,w,表示s到e的雙向路的權值為w。 
    輸出: 
    輸出次小生成樹的值,如果不存在輸出-1。 
    樣例輸入: 
    2 
    3 3 
    1 2 1 
    2 3 2 
    3 1 3 
    4 4 
    1 2 2 
    2 3 2 
    3 4 2 
    4 1 2 
    樣例輸出: 
    4 
    6 


ac代碼(注釋寫的比較清楚):

   

 #include <stdio.h>   #include <stdlib.h>   #include <string.h>      #define MAX 100000      int father[210];  // 并查集   int visit[210]; // 記錄最小生成樹用到的邊的下標   int windex; // 記錄最小生成樹用到邊的數量      typedef struct node {     int st, ed, w;   } node;      /**    * 預處理并查集數組    */   void preProcess()   {     int i, len = sizeof(father) / sizeof(father[0]);        for (i = 0; i < len; i ++) {       father[i] = i;     }      }      /**    * kruskal使用貪心算法,將邊按權值從小到大排序    */   int cmp(const void *p, const void *q)   {     const node *a = p;     const node *b = q;        return a->w - b->w;   }      /**    * 并查集尋找起始結點,路徑壓縮優化    */   int findParent(int x)   {     int parent;        if (x == father[x]) {       return x;     }        parent = findParent(father[x]);     father[x] = parent;          return parent;   }      /**    * 求最小生成樹    */   int minTree(node *points, int m, int n)   {     preProcess();        int i, count, flag, pa, pb;        for (i = count = flag = windex = 0; i < m; i ++) {       pa = findParent(points[i].st);       pb = findParent(points[i].ed);              if (pa != pb) {         visit[windex ++] = i;         father[pa] = pb;         count ++;       }          if (count == n - 1) {         flag = 1;         break;       }     }        return flag;   }      /**    * 求次小生成樹    */   int secMinTree(node *points, int m, int n)   {     int i, j, min, tmp, pa, pb, count, flag;        for (i = 0, min = MAX; i < windex; i ++) {       preProcess();          // 求次小生成樹       for (j = count = tmp = flag = 0; j < m; j ++) {         if (j != visit[i]) {           pa = findParent(points[j].st);           pb = findParent(points[j].ed);              if (pa != pb) {             count ++;             tmp += points[j].w;             father[pa] = pb;           }              if (count == n - 1) {             flag = 1;             break;           }         }       }          if (flag && tmp < min)  min = tmp;     }        min = (min == MAX) ? -1 : min;        return min;    }         int main(void)   {     int i, t, n, m, flag, min;     node *points;        scanf("%d", &t);        while (t --) {       scanf("%d %d", &n, &m);          points = (node *)malloc(sizeof(node) * m);           for (i = 0; i < m; i ++) {         scanf("%d %d %d", &points[i].st, &points[i].ed, &points[i].w);       }          qsort(points, m, sizeof(points[0]), cmp);              flag = minTree(points, m, n);          if (flag == 0) {  // 無法生成最小生成樹         printf("-1/n");         continue;       } else {         min = secMinTree(points, m, n);         printf("%d/n", min);       }             free(points);     }        return 0;   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美中文字幕在线播放| 北条麻妃在线一区二区| 国产日韩欧美自拍| 中文字幕在线观看亚洲| 亚洲老头老太hd| 国外视频精品毛片| 久久99国产精品久久久久久久久| 亚洲色图13p| 国产精品扒开腿做爽爽爽的视频| 国产精品日本精品| 91精品视频观看| 久久午夜a级毛片| 精品国产精品三级精品av网址| 国产69精品久久久久久| 欧美黑人巨大精品一区二区| 日韩免费中文字幕| 国产精品男女猛烈高潮激情| 日韩欧美亚洲成人| 国产精品v片在线观看不卡| 91精品国产高清久久久久久久久| 欧美国产亚洲精品久久久8v| 国产精品一区二区三区免费视频| 欧美午夜精品久久久久久久| 91精品视频网站| 国产精品美女久久久久久免费| 成人免费午夜电影| 精品中文字幕久久久久久| 久久国产精品网站| 91精品免费看| 懂色av影视一区二区三区| 亚洲视频一区二区三区| 亚洲va男人天堂| 亚洲а∨天堂久久精品9966| 久久久999精品免费| 日韩精品有码在线观看| 精品国产乱码久久久久酒店| 亚洲二区在线播放视频| 亚洲国产精品女人久久久| 午夜伦理精品一区| 亚洲国产精品悠悠久久琪琪| 亚洲精品xxx| 成人免费看吃奶视频网站| 97国产精品人人爽人人做| 欧美午夜影院在线视频| 亚洲第一综合天堂另类专| 亚洲精品日韩久久久| 中文字幕成人在线| 中文字幕日韩在线播放| 亚洲欧美日韩直播| 亚洲mm色国产网站| 亚洲一区制服诱惑| 国产成人精品av| 97久久伊人激情网| 亚洲在线观看视频| 91精品91久久久久久| 国产精品18久久久久久首页狼| 久久精品久久精品亚洲人| 亚洲人成电影网站色www| 91久久精品在线| 日韩电影大片中文字幕| 国产精品白嫩初高中害羞小美女| 91在线网站视频| 久久久精品国产| 欧洲s码亚洲m码精品一区| 精品国产91乱高清在线观看| 色婷婷av一区二区三区久久| 精品视频中文字幕| 欧美韩国理论所午夜片917电影| 精品国产91乱高清在线观看| 欧美日韩爱爱视频| 超碰91人人草人人干| 69国产精品成人在线播放| 川上优av一区二区线观看| 韩日欧美一区二区| 亚洲最大的免费| 日韩最新av在线| 欧美激情中文字幕在线| 国产精品高潮呻吟视频| 亚洲欧美日本精品| 亚洲成人动漫在线播放| 国产福利视频一区| 在线观看不卡av| 亚洲图片欧洲图片av| 在线观看成人黄色| 亚洲福利视频免费观看| 欧美精品在线极品| 伊人久久男人天堂| 亚洲精品日韩欧美| 丝袜一区二区三区| 国产精品三级在线| 97久久伊人激情网| 精品视频在线观看日韩| 岛国av一区二区三区| 欧美日韩第一页| 久久久精品中文字幕| 91国产一区在线| 亚洲的天堂在线中文字幕| 欧美一级免费视频| 国产欧美一区二区三区四区| 久久精品电影一区二区| 精品国产一区二区三区久久| 日韩亚洲欧美成人| 亚洲一区二区久久久久久| 欧美第一淫aaasss性| 成人淫片在线看| 国产69精品久久久| 欧美视频免费在线观看| 欧美午夜影院在线视频| 亚洲最大福利视频| 97久久超碰福利国产精品…| 国产精品亚发布| 浅井舞香一区二区| 国产丝袜视频一区| 亚洲3p在线观看| 日韩精品久久久久久久玫瑰园| 亚洲欧美激情精品一区二区| 成人日韩在线电影| 91av在线播放视频| 久久躁狠狠躁夜夜爽| 亚洲午夜未满十八勿入免费观看全集| 精品亚洲一区二区三区四区五区| 91热精品视频| 亚洲一区二区久久久久久久| 成人国产精品色哟哟| 91成人在线视频| 午夜精品久久久99热福利| 亚洲福利视频二区| 91伊人影院在线播放| 亚洲男人第一av网站| 日韩电影免费观看在线观看| 久久不射热爱视频精品| 欧美午夜激情在线| 欧美午夜激情在线| 97色在线观看免费视频| 亚洲免费影视第一页| 日韩精品免费观看| 亚洲视频在线观看| 国产在线观看精品一区二区三区| 国产精品久久久久久久久久99| 日本成人黄色片| 色播久久人人爽人人爽人人片视av| 琪琪亚洲精品午夜在线| 欧美精品videos另类日本| 国产成人精品日本亚洲| 日本精品久久中文字幕佐佐木| 国产免费一区二区三区香蕉精| 91欧美日韩一区| 在线免费观看羞羞视频一区二区| 中文字幕亚洲欧美日韩2019| 久久精品99国产精品酒店日本| 久久久久久69| 91精品视频免费观看| 午夜精品久久久久久99热软件| 国产亚洲美女精品久久久| 色婷婷av一区二区三区在线观看| 国产精品91在线| 日韩精品免费在线视频| 色小说视频一区| 日韩av电影在线免费播放| 成人av番号网| 一区二区三区四区视频| 久久福利网址导航| 久久国产精品影片| 午夜精品久久久久久久久久久久|