青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

最小度限制生成樹

Posted on 2011-05-23 21:05 Mato_No1 閱讀(608) 評論(0)  編輯 收藏 引用 所屬分類: 圖算法
給出一個帶邊權連通無向圖,當中指定一個點V0,要求這個圖的一個生成樹,使得樹中V0點的度數(和V0點關聯的邊數)剛好為一個指定值P,求滿足此條件的邊權和最小的生成樹。

【算法】(某神犇的論文里有詳細證明,這里省略了囧……)
設l[i]為連接圖中點V0與點i之間的邊的長度(若有多條邊取權值最小的,若沒有邊則為無窮大)。
(1)在圖中刪除點V0,新的圖不一定是連通圖,設其有B個連通塊;
(2)若P<B則無解,否則轉下一步;
(3)對這B個連通塊分別求最小生成樹,得到一個生成森林。然后在圖中重新加入點V0,對每個連通塊,找出該連通塊內l值最小的點V',添加邊(V0, V'),這樣就得到了一棵初始的生成樹,或者說,這是V0點度數為B的最小的生成樹;
(4)然后就是不斷往里面加入與V0相關聯的邊。從V0點開始,對整棵生成樹BFS遍歷,對每個點i,找到目前的生成樹中從V0到i的路徑上權值最大的邊,設E_len[i]為這條邊的權值,E_No[i]為這條邊的編號(由于本沙茶使用的是DL邊表,故記錄編號),這個東東的求法很容易,省略;
(5)最后,枚舉除V0點外的每個點,找到(E_len[i]-l[i])值最大的點i,然后在圖中刪除邊E_No[i],加入邊(V0, i),這樣得到的仍然是原圖的生成樹,且V0的度數增加1;
(6)重復以上過程(P-B)次即得結果。

【實現注意】
為了編程實現更加方便,注意以下幾點:
(1)一開始不加入V0,而不是加入了再刪去(但各點l值要在輸入時求出);
(2)一開始不用先求出B的值,而是先求出最小生成森林(用Kruskal,不斷加邊,直到加到不能再加為止)和初始生成樹,再遍歷初始生成樹得到B值;
(3)由于涉及刪邊,一定要用DL邊表。

【代碼】(PKU1639,注意這題是求V0度數不超過給定值P的最小生成樹,簡單改裝即可):
#include <iostream>
#include 
<stdio.h>
#include 
<string>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
const int MAXN = 30, MAXM = 5000, MAXLEN = 20, INF = ~0U >> 2;
struct edge {
    
int a, b, len, pre, next;
} ed[MAXM 
+ MAXM];
struct edge0 {
    
int a, b, len;
} ed0[MAXM];
int n, m, m0 = 0, P, B = 0, l[MAXN], u[MAXN], B_No[MAXN], q[MAXN], E_No[MAXN], E_len[MAXN], res = 0;
string NAMELIST[MAXN];
bool vst[MAXN];
void add_edge0(int a, int b, int len)
{
    ed0[m0].a 
= a; ed0[m0].b = b; ed0[m0++].len = len;
}
void init_d()
{
    re(i, n) ed[i].a 
= ed[i].pre = ed[i].next = i;
    
if (n % 2) m = n + 1else m = n;
}
void add_edge(int a, int b, int len)
{
    ed[m].a 
= a; ed[m].b = b; ed[m].len = len; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
    ed[m].a 
= b; ed[m].b = a; ed[m].len = len; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
void del_edge(int No)
{
    ed[ed[No].pre].next 
= ed[No].next; ed[ed[No].next].pre = ed[No].pre;
    ed[ed[No 
^ 1].pre].next = ed[No ^ 1].next; ed[ed[No ^ 1].next].pre = ed[No ^ 1].pre;
}
void init()
{
    n 
= 1; NAMELIST[0= "Park"int m_;
    scanf(
"%d"&m_); char ch = getchar(), s01[MAXLEN], s02[MAXLEN]; int No1, No2, l0, tmp;
    re(i, MAXN) l[i] 
= INF;
    re(i, m_) {
        scanf(
"%s %s %d", s01, s02, &l0); ch = getchar();
        No1 
= -1; re(j, n) if (NAMELIST[j] == s01) {No1 = j; break;} if (No1 == -1) NAMELIST[No1 = n++= s01;
        No2 
= -1; re(j, n) if (NAMELIST[j] == s02) {No2 = j; break;} if (No2 == -1) NAMELIST[No2 = n++= s02;
        
if (No1 > No2) {tmp = No1; No1 = No2; No2 = tmp;}
        
if (No1) add_edge0(No1, No2, l0); else if (l0 < l[No2]) l[No2] = l0;
    }
    scanf(
"%d"&P);
}
int cmp(const void *s1, const void *s2)
{
    
return ((edge0 *)s1)->len - ((edge0 *)s2)->len;
}
int find_root(int x)
{
    
int r = x, r0 = x, tmp;
    
while (u[r] >= 0) r = u[r];
    
while (u[r0] >= 0) {tmp = u[r0]; u[r0] = r; r0 = tmp;}
    
return r;
}
void uni(int r1, int r2)
{
    
int sum = u[r1] + u[r2];
    
if (u[r1] >= u[r2]) {u[r1] = r2; u[r2] = sum;} else {u[r2] = r1; u[r1] = sum;}
}
void prepare()
{
    qsort(ed0, m0, 
12, cmp);
    re2(i, 
1, n) u[i] = -1; init_d();
    
int x1, x2, l0, r1, r2;
    re(i, m0) {
        x1 
= ed0[i].a; x2 = ed0[i].b; l0 = ed0[i].len; r1 = find_root(x1); r2 = find_root(x2);
        
if (r1 != r2) {uni(r1, r2); add_edge(x1, x2, l0); res += l0;}
    }
    re2(i, 
1, n) B_No[i] = -1;
    
int Best, Best_No;
    re2(i, 
1, n) if (B_No[i] == -1) {
        B_No[i] 
= B; Best = l[i]; Best_No = q[0= i;
        
int j, k;
        
for (int front=0, rear=0; front<=rear; front++) {
            j 
= q[front];
            
for (int p=ed[j].next; p != j; p=ed[p].next) {
                k 
= ed[p].b;
                
if (B_No[k] == -1) {
                    B_No[k] 
= B; q[++rear] = k; if (l[k] < Best) {Best = l[k]; Best_No = k;}
                }
            }
        }
        add_edge(
0, Best_No, Best); res += Best; B++;
    }
}
void solve()
{
    vst[
0= 1;
    re2(P0, B, P) {
        re2(i, 
1, n) {E_len[i] = INF; vst[i] = 0;} q[0= 0;
        
int i, j, l0;
        
for (int front=0, rear=0; front<=rear; front++) {
            i 
= q[front];
            
for (int p=ed[i].next; p != i; p=ed[p].next) {
                j 
= ed[p].b; l0 = ed[p].len;
                
if (!vst[j]) {
                    vst[j] 
= 1; q[++rear] = j;
                    
if (E_len[i] > l0) {E_len[j] = E_len[i]; E_No[j] = E_No[i];} else {E_len[j] = l0; E_No[j] = p;}
                }
            }
        }
        
int Best = 0, Best_No, Best_v;
        re2(i, 
1, n) {
            l0 
= E_len[i] - l[i];
            
if (l0 > Best) {Best = l0; Best_No = E_No[i]; Best_v = i;};
        }
        
if (Best) {del_edge(Best_No); add_edge(0, Best_v, l[Best_v]); res -= Best;} else break;
    }
}
void pri()
{
    printf(
"Total miles driven: %d\n", res);
}
int main()
{
    init();
    prepare();
    solve();
    pri();
    
return 0;
}

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久噜噜噜久久中文字幕色伊伊| 欧美福利电影网| 美日韩精品视频| 久久精品视频va| 久久免费黄色| 国产精品一区久久久| 欧美婷婷在线| 国产日韩欧美a| 激情久久综合| 亚洲国产精品一区二区第一页| 亚洲高清资源| 亚洲视频1区| 久久久久久97三级| 欧美激情一区在线观看| 99精品久久| 欧美亚洲综合网| 蜜臀91精品一区二区三区| 欧美美女喷水视频| 国产一区二区三区观看| 亚洲人成7777| 午夜精品在线| 亚洲第一页自拍| 亚洲毛片在线| 欧美在线视频a| 欧美日韩免费高清一区色橹橹| 国产亚洲一区二区三区在线观看| 91久久精品一区| 久久久久久9999| 亚洲午夜精品视频| 美女性感视频久久久| 国产麻豆精品久久一二三| 在线观看日韩国产| 午夜伦欧美伦电影理论片| 欧美激情一区二区三级高清视频| 亚洲性图久久| 欧美日韩亚洲一区三区| **性色生活片久久毛片| 亚洲欧美日韩在线不卡| 亚洲国产日韩欧美一区二区三区| 亚洲欧美日韩国产精品| 蜜臀a∨国产成人精品 | 一区二区日韩免费看| 欧美一区二区免费| 欧美日韩一视频区二区| 亚洲欧洲在线一区| 久久在线免费视频| 午夜精品久久久久久久久久久久| 欧美日韩精品伦理作品在线免费观看| 在线观看国产一区二区| 欧美专区第一页| 亚洲欧美日韩在线观看a三区| 欧美日韩国产高清视频| 日韩视频免费| 亚洲青色在线| 欧美黑人多人双交| 亚洲成色999久久网站| 久久狠狠亚洲综合| 欧美一区二区国产| 国产日韩1区| 久久久久久综合网天天| 欧美一区二区三区免费观看视频| 国产欧美日韩麻豆91| 欧美日韩亚洲一区在线观看| 在线观看欧美激情| 欧美成人嫩草网站| 欧美黑人一区二区三区| 亚洲免费电影在线观看| 欧美黄免费看| 欧美精品久久久久久久久老牛影院| 亚洲国产导航| 亚洲精品美女在线观看| 欧美色另类天堂2015| 亚洲一区二区三区涩| 日韩一级在线| 国产精品丝袜91| 麻豆成人在线| 欧美超级免费视 在线| 一区二区高清视频| 午夜精品影院| 亚洲电影在线免费观看| 亚洲国产成人在线| 欧美性色视频在线| 久久精视频免费在线久久完整在线看| 久久精品国产视频| 亚洲高清一区二区三区| 日韩亚洲精品在线| 国内自拍视频一区二区三区 | 久久久久久自在自线| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲日本中文字幕免费在线不卡| 亚洲精品中文字幕女同| 国产精品视频区| 欧美成人免费小视频| 欧美日韩国产小视频| 香蕉精品999视频一区二区| 欧美亚洲免费| 中文一区二区| 久久精品91久久香蕉加勒比 | 国产精品一卡二卡| 欧美电影免费观看| 国产精品久久久久一区二区三区共| 久久国产主播精品| 欧美精品在线网站| 久久九九久久九九| 国产精品yjizz| 欧美成黄导航| 99视频一区| 久久精品免费电影| 一区二区高清在线观看| 久久精品一区蜜桃臀影院| 亚洲午夜精品网| 欧美成人中文字幕| 久久影视三级福利片| 国产精品久久亚洲7777| 亚洲人成人77777线观看| 亚洲无吗在线| 99国产精品| 久久综合九色综合久99| 久久国产一二区| 欧美色欧美亚洲另类二区| 欧美承认网站| 精品动漫3d一区二区三区免费| 在线亚洲美日韩| 欧美女同视频| 91久久国产精品91久久性色| 国内外成人在线视频| 欧美一乱一性一交一视频| 午夜精品电影| 欧美午夜寂寞影院| 亚洲精品在线看| 亚洲私人影院在线观看| 欧美精品一区三区| 亚洲精品乱码久久久久久日本蜜臀| 91久久精品国产91久久性色| 久久精品女人天堂| 狂野欧美性猛交xxxx巴西| 国产日韩精品在线播放| 午夜精品三级视频福利| 欧美一级淫片播放口| 国产伦精品一区二区三| 亚洲欧美网站| 久久精品人人做人人综合| 国产精品一区二区久久| 亚洲女优在线| 久久久人成影片一区二区三区| 国产欧美日韩综合精品二区| 亚洲自拍偷拍麻豆| 欧美亚洲综合网| 国内精品久久久久久影视8| 欧美一区二区视频在线| 美国十次了思思久久精品导航| 在线不卡视频| 欧美国产日韩精品免费观看| 99re6热只有精品免费观看 | 激情亚洲网站| 久久综合狠狠综合久久激情| 亚洲成人在线视频播放| 一本久久a久久精品亚洲| 国产精品久久久久9999| 久久精品系列| 亚洲激情综合| 午夜免费电影一区在线观看| 激情久久久久| 欧美日韩另类字幕中文| 亚洲一区欧美一区| 欧美成人午夜视频| 在线一区观看| 国内精品模特av私拍在线观看| 麻豆精品在线视频| 亚洲精品一区二区三区不| 欧美亚洲午夜视频在线观看| 在线视频国内自拍亚洲视频| 欧美精品久久久久久久久老牛影院| 亚洲一区欧美激情| 亚洲欧洲日本专区| 久久精品视频免费| 亚洲天堂网在线观看| 国内久久婷婷综合| 欧美日韩高清在线观看| 午夜久久久久久| 亚洲日韩欧美视频一区| 久久久人成影片一区二区三区 | 久久精品国产一区二区三区| 91久久国产精品91久久性色| 久久精品亚洲一区二区三区浴池| 亚洲精品日日夜夜| 国产婷婷色一区二区三区四区 | 欧美精品在线播放| 欧美成人免费全部观看天天性色| 日韩亚洲欧美精品| 激情丁香综合| 国产欧美一区二区三区久久| 欧美精品亚洲| 免费视频一区二区三区在线观看| 午夜日韩av| 亚洲女女女同性video| 99re66热这里只有精品3直播| 亚洲电影激情视频网站| 免费在线一区二区| 久久精品国产第一区二区三区最新章节 |