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

The Fourth Dimension Space

枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

pku 3164 最小樹形圖(Zhu-Liu Algorithm)

所謂的最小樹形圖,就是讓你在一個有向圖中找一個根和由根擴(kuò)展出來的一顆有向的生成樹,并且使這棵樹的權(quán)值最小。
令人欣喜的是,這個算法是由中國人提出來的,這也是我正式學(xué)習(xí)的第一個中國人提出來的算法^_^

最小樹形圖算法
(Zhu-Liu Algorithm)

1.       設(shè)最小樹形圖的總權(quán)值為cost,置cost0

2.       除源點外,為其他所有節(jié)點Vi找一條權(quán)值最小的入邊,加入集合TT就是最短邊的集合。加邊的方法:遍歷所有點到Vi的邊中權(quán)值最小的加入集合T,記pre[Vi]為該邊的起點,mincost[Vi]為該邊的權(quán)值。

3.       檢查集合T中的邊是否存在有向環(huán),有則轉(zhuǎn)到步驟4,無則轉(zhuǎn)到步驟5。這里需要利用pre數(shù)組,枚舉檢查過的點作為搜索的起點,類似dfs的操作判斷有向環(huán)。

4.       將有向環(huán)縮成一個點。設(shè)環(huán)中有點{Vk1,Vk2,…,Vki}i個點,用Vk代替縮成的點。在壓縮后的圖中,更新所有不在環(huán)中的點VVk的距離:

map[V][Vk] = min {map[V][Vkj]-mincost[Vki]} 1<=j<=i

map[Vk][V] = min {map[Vkj][V]}           1<=j<=I

5.       cost加上T中有向邊的權(quán)值總和就是最小樹形圖的權(quán)值總和。

源代碼如下:(參考了網(wǎng)上的代碼)
#include<iostream>
#include
<cstring>
#include
<cstdio>
#include
<cmath>
using namespace std;

#define INF 99999999
#define min( a, b ) ( (a)< (b)?(a): (b) )

struct point
{

    
double x;
    
double y;
}
p[200];

int pre[200];//記錄該節(jié)點的前驅(qū)
double graph[200][200], ans;//圖數(shù)組和結(jié)果
bool   visit[110], circle[110];//visit記錄該點有沒有被訪問過,circle記錄改點是不是在一個圈里
int    n, m, root;//頂點數(shù)+邊數(shù)+根節(jié)點標(biāo)號

void dfs( int t )//一個深度優(yōu)先搜索,搜索出一個最大的聯(lián)通空間
{
    
int i;
    visit[t]
= true;
    
for(i= 1; i<= n; ++i )
    
{
        
if!visit[i] && graph[t][i]!= INF )
            dfs( i );
    }

}


bool check()//這個函數(shù)用來檢查最小樹形圖是否存在,即如果存在,那么一遍dfs后,應(yīng)該可以遍歷到所有的節(jié)點
{
    memset( visit, 
falsesizeof(visit) );
    dfs( root );
    
    
forint i= 1; i<= n; ++i )
    
{
        
if!visit[i] ) 
            
return false;
    }

    
return true;
}


double dist( int i, int j )
{
    
return sqrt( (p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y) );
}


int exist_circle()//判斷圖中是不是存在有向圈
{
    
int i;
    
int j;
    root
= 1; pre[root]= root;
    
for(i= 1; i<= n; ++i )
    
{
        
if!circle[i] && i!= root )
        
{
            pre[i]
= i; graph[i][i]= INF;
            
            
for(j= 1; j<= n; ++j )
            
{
                
if!circle[j] && graph[j][i]< graph[pre[i]][i] )
                    pre[i]
= j;
            }

        }

    }
//這個for循環(huán)負(fù)責(zé)找出所有非根節(jié)點的前驅(qū)節(jié)點
    for( i= 1; i<= n; ++i )
    
{
        
if( circle[i] ) 
            
continue;
        memset( visit, 
falsesizeof(visit) );
        
int j= i;
        
while!visit[j] ) 
        

            visit[j]
= true
            j
= pre[j]; 
        }

        
if( j== root )
            
continue;
        
        
return j;
    }
//找圈過程,最后返回值是圈中的一個點
    
    
return -1;//如果沒有圈,返回-1
}



void  update( int t )//縮圈之后更新數(shù)據(jù)
{
    
int i;
    
int j;
    ans
+= graph[pre[t]][t];
    
for(i=pre[t]; i!= t; i= pre[i] )
    
{
        ans
+= graph[pre[i]][i];
        circle[i]
= true;
    }
//首先把圈里的邊權(quán)全部加起來,并且留出t節(jié)點,作為外部接口
    
    
for(i= 1; i<= n; ++i )
        
if!circle[i] && graph[i][t]!= INF )
            graph[i][t]
-= graph[pre[t]][t];
    
//上面這個for循環(huán)的作用是對t節(jié)點做更新操作,為什么要單獨做?你可以看看線面這個循環(huán)的跳出條件。
    for(j= pre[t]; j!= t; j= pre[j] )
        
forint i= 1; i<= n; ++i )
        
{
            
if( circle[i] ) 
                
continue;
            
if( graph[i][j]!= INF )
            graph[i][t]
= min( graph[i][t], graph[i][j]- graph[pre[j]][j] );
            
//////////////////////////////////////////////////////////////////////////
            graph[t][i]= min( graph[j][i], graph[t][i] );
        }

    
//這個循環(huán)對圈中的其他頂點進(jìn)行更新
}


void solve()
{
    
int j;
    memset( circle, 
falsesizeof(circle) );
    
while( ( j= exist_circle() )!= -1 ) 
        update( j );
    
    
for( j= 1; j<= n; ++j )
        
if( j!= root && !circle[j] )
            ans
+= graph[pre[j]][j];
    
    printf(
"%.2lf\n", ans );
}


int main()
{
    
int i;
    
while( scanf("%d%d",&n,&m)!= EOF )
    
{
        
for(i= 0; i<= n; ++i )
            
forint j= 0; j<= n; ++j )
                graph[i][j]
= INF;
        
        
for(i= 1; i<= n; ++i )
            scanf(
"%lf%lf",&p[i].x, &p[i].y );
        
        
for(i= 0; i< m; ++i )
        
{
            
int a, b;
            scanf(
"%d%d",&a,&b);
            graph[a][b]
= dist( a, b );
        }

        
        root
= 1
        ans
= 0;
        
if!check() ) 
            printf(
"poor snoopy\n");
        
else  
            solve();
    }

    
    
return 0;
}



posted on 2009-10-29 19:38 abilitytao 閱讀(2190) 評論(2)  編輯 收藏 引用

評論

# re: pku 3164 最小樹形圖(Zhu-Liu Algorithm) 2009-10-30 11:58 淘寶網(wǎng)首頁

學(xué)習(xí)!學(xué)習(xí)~~  回復(fù)  更多評論   

# re: pku 3164 最小樹形圖(Zhu-Liu Algorithm) 2009-11-03 16:31 argmax

這個算法應(yīng)該叫Chu-Liu-Edmond算法吧!  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产清纯| 久久五月天婷婷| 亚洲在线成人| 国产精品日韩在线观看| 亚洲欧美日韩在线播放| 久久久久久一区二区| 在线观看三级视频欧美| 欧美连裤袜在线视频| 一区二区三区日韩精品视频| 久久国产精品久久久| 极品日韩久久| 欧美激情第六页| 亚洲一区二区三区久久| 老司机精品视频网站| 亚洲美女色禁图| 国产乱肥老妇国产一区二| 久久精品国产在热久久 | 免费av成人在线| 亚洲久久在线| 久久夜色撩人精品| 99精品视频免费观看| 国产日韩欧美自拍| 欧美www视频在线观看| 中文精品99久久国产香蕉| 久久九九久精品国产免费直播 | 亚洲精品偷拍| 久久精品人人爽| 一本大道久久精品懂色aⅴ| 国产亚洲精品高潮| 欧美片在线观看| 欧美影视一区| 9国产精品视频| 欧美大色视频| 久久国产精品电影| 一区二区三区国产| 国内精品模特av私拍在线观看| 欧美—级在线免费片| 久久国产精品久久久久久电车| 亚洲精品中文字| 欧美不卡高清| 欧美伊久线香蕉线新在线| 亚洲精选中文字幕| 曰韩精品一区二区| 欧美人与禽性xxxxx杂性| 一本色道久久综合一区| 亚洲欧美资源在线| 最近看过的日韩成人| 亚洲电影免费| 一区二区三区 在线观看视频| 伊人久久综合| 欧美一区二区三区免费大片| 一本色道久久99精品综合| 久热re这里精品视频在线6| 性色av一区二区怡红| 欧美日韩成人综合天天影院| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久久久久久久久久久久久| 欧美顶级艳妇交换群宴| 黄色成人av网| 久久av一区二区三区漫画| 欧美有码在线观看视频| 国产精品va| 亚洲另类自拍| 亚洲视频在线一区| 欧美日韩精品二区| 99精品欧美一区二区三区| 日韩西西人体444www| 欧美成人性生活| 亚洲国产精品一区在线观看不卡| 国产午夜精品一区二区三区欧美 | 久久福利一区| 国产精品一区毛片| 午夜精品影院| 久久久999精品| 激情久久中文字幕| 久久免费国产精品1| 欧美成人中文字幕| 亚洲精品美女91| 久久久久国产精品一区| 蜜臀va亚洲va欧美va天堂| 狠狠干综合网| 男人的天堂成人在线| 亚洲欧洲一区| 亚洲一区免费视频| 国产欧美一区二区色老头| 久久av二区| 亚洲国产精品久久久久| 亚洲午夜久久久| 国产欧美va欧美va香蕉在| 久久国产精品99国产| 欧美黄色日本| 亚洲视频一区二区免费在线观看| 国产精品美女久久福利网站| 翔田千里一区二区| 欧美va天堂在线| 一本不卡影院| 国产精品中文在线| 久久综合伊人77777| 日韩午夜电影av| 欧美怡红院视频| 怡红院av一区二区三区| 欧美日本国产| 欧美一区高清| 亚洲人成网站999久久久综合| 亚洲欧美日本日韩| 亚洲电影第三页| 欧美亚洲第一区| 久久一区二区三区超碰国产精品| 亚洲乱码一区二区| 麻豆精品在线视频| 亚洲一区二区三区高清不卡| 黄色欧美成人| 国产精品久久久久久福利一牛影视 | 亚洲第一精品福利| 欧美午夜宅男影院| 免费试看一区| 久久国产精品99国产| 在线亚洲电影| 亚洲电影在线| 猛男gaygay欧美视频| 亚洲欧美在线一区| 夜夜爽www精品| 亚洲第一精品夜夜躁人人爽| 国产欧美日韩视频一区二区三区| 欧美精品九九| 免费看av成人| 久久女同互慰一区二区三区| 亚洲免费视频网站| 日韩一级黄色av| 亚洲国产天堂久久综合网| 玖玖国产精品视频| 久久久av网站| 欧美一区二区三区免费视| 亚洲一区在线视频| av成人毛片| 亚洲精品黄色| 亚洲欧洲久久| 亚洲国产小视频在线观看| 黄色精品网站| 国产一区二区三区电影在线观看| 国产精品欧美久久| 欧美天堂亚洲电影院在线播放 | 欧美一区二区三区啪啪| 亚洲特级片在线| 一区二区三区毛片| 亚洲性感美女99在线| 亚洲视频一二区| 亚洲午夜激情网页| 亚洲尤物在线视频观看| 亚洲天堂男人| 亚洲在线视频免费观看| 亚洲午夜一区二区三区| 在线综合亚洲| 亚洲男人的天堂在线| 亚洲男人的天堂在线观看| 性欧美video另类hd性玩具| 亚洲欧美伊人| 久久久成人网| 蜜乳av另类精品一区二区| 女生裸体视频一区二区三区| 欧美精品少妇一区二区三区| 欧美日韩一区二区三区| 国产精品电影网站| 国产一区二区三区免费不卡 | 蜜桃av一区二区| 欧美激情按摩在线| 国产精品xnxxcom| 国产日韩一区二区| 在线观看一区欧美| 一本色道久久88精品综合| 亚洲女性喷水在线观看一区| 久久九九免费| 欧美激情中文不卡| 一区二区久久久久| 久久精品二区| 欧美精品一区二区视频 | 欧美激情aaaa| 国产精品自在欧美一区| 激情成人亚洲| 在线一区二区三区四区| 欧美一区二区三区免费看| 欧美国产亚洲精品久久久8v| 99热这里只有成人精品国产| 欧美在线日韩精品| 欧美久久影院| 国产主播一区二区三区| 日韩视频中午一区| 久久久噜噜噜久久狠狠50岁| 亚洲黄色大片| 久久成人久久爱| 欧美三级午夜理伦三级中视频| 国外成人在线视频网站| 亚洲私人影院| 亚洲第一黄网| 久久精品男女| 国产精品一国产精品k频道56| 91久久精品美女高潮| 久久精品国产99国产精品澳门| 亚洲精品久久久久久久久| 久久动漫亚洲|