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

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

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

4.       將有向環(huán)縮成一個點(diǎn)。設(shè)環(huán)中有點(diǎn){Vk1,Vk2,…,Vki}i個點(diǎn),用Vk代替縮成的點(diǎn)。在壓縮后的圖中,更新所有不在環(huán)中的點(diǎ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é)點(diǎn)的前驅(qū)
double graph[200][200], ans;//圖數(shù)組和結(jié)果
bool   visit[110], circle[110];//visit記錄該點(diǎn)有沒有被訪問過,circle記錄改點(diǎn)是不是在一個圈里
int    n, m, root;//頂點(diǎn)數(shù)+邊數(shù)+根節(jié)點(diǎn)標(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é)點(diǎn)
{
    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é)點(diǎn)的前驅(qū)節(jié)點(diǎn)
    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;
    }
//找圈過程,最后返回值是圈中的一個點(diǎn)
    
    
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é)點(diǎn),作為外部接口
    
    
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é)點(diǎn)做更新操作,為什么要單獨(dú)做?你可以看看線面這個循環(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)對圈中的其他頂點(diǎ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| 1000精品久久久久久久久| 国产精品日韩高清| 欧美日韩人人澡狠狠躁视频| 久久久久88色偷偷免费| 亚洲欧美日本精品| 在线一区二区三区做爰视频网站| 欧美激情精品久久久久久免费印度| 久久国产色av| 欧美一区二区在线看| 亚洲一级高清| 亚洲视频第一页| 一区二区三区久久| 亚洲人成人99网站| 亚洲欧洲在线免费| 亚洲黄色免费电影| 亚洲黑丝在线| 亚洲精品乱码| 亚洲精品久久嫩草网站秘色| 亚洲高清激情| 亚洲日本理论电影| 亚洲人成网站色ww在线 | 国产亚洲精品高潮| 国产精品欧美精品| 国产精品久久久久999| 欧美日韩日韩| 国产精品久久久久av| 欧美性猛交xxxx免费看久久久| 欧美日韩亚洲一区二区三区四区| 欧美激情精品久久久久| 欧美激情精品久久久久久蜜臀| 美女主播一区| 欧美成人午夜| 欧美激情精品久久久久久| 欧美久久一级| 欧美三区免费完整视频在线观看| 欧美日在线观看| 国产精品免费看| 国产真实精品久久二三区| 一区免费观看视频| 亚洲日韩第九十九页| 亚洲免费成人av| 亚洲一区二区三区视频播放| 亚洲字幕在线观看| 久久精品视频播放| 欧美成黄导航| 日韩亚洲欧美综合| 亚洲欧美日本另类| 久久先锋资源| 欧美婷婷在线| 国产一区二区精品久久91| 亚洲第一狼人社区| 99riav1国产精品视频| 亚洲综合久久久久| 久久天堂av综合合色| 亚洲黄网站黄| 亚洲欧美日本另类| 老色鬼久久亚洲一区二区| 欧美日韩国产区| 国产亚洲精品久久久久久| 亚洲国产精品www| 亚洲欧美成人精品| 麻豆av一区二区三区久久| 亚洲精品中文字幕在线| 亚洲欧美日韩精品久久| 久久综合五月| 国产精品视频不卡| 亚洲国产一区二区三区高清 | 亚洲一区二区三区成人在线视频精品| 欧美一区二区高清在线观看| 欧美成人一区二免费视频软件| 国产精品成人观看视频免费| 黄色一区二区在线观看| aa亚洲婷婷| 久久久久天天天天| 99精品久久免费看蜜臀剧情介绍| 午夜精品久久久久久久99樱桃| 欧美不卡一区| 国产综合av| 亚洲线精品一区二区三区八戒| 快射av在线播放一区| 99精品视频免费观看| 久久久久久9| 国产精品美女主播| 亚洲精品国精品久久99热| 欧美在线中文字幕| 亚洲精品无人区| 久久久www成人免费毛片麻豆| 欧美婷婷在线| 日韩亚洲在线| 欧美成人r级一区二区三区| 亚洲欧美一区在线| 欧美图区在线视频| 亚洲精品日产精品乱码不卡| 久久久精品欧美丰满| 亚洲香蕉伊综合在人在线视看| 欧美1区视频| 激情文学综合丁香| 欧美一区免费| 亚洲一级一区| 欧美三日本三级少妇三99| 亚洲高清在线观看| 老司机一区二区三区| 亚洲免费在线观看| 国产精品成人一区| aaa亚洲精品一二三区| 亚洲国产国产亚洲一二三| 久久电影一区| 韩国久久久久| 久久久久久亚洲精品中文字幕| 亚洲一区二区三区涩| 欧美视频日韩视频| 亚洲天堂av在线免费| 亚洲人成艺术| 欧美激情一二三区| 亚洲精品免费电影| 欧美黄色aa电影| 美女国产一区| 91久久夜色精品国产网站| 免费日韩一区二区| 久久―日本道色综合久久| 极品日韩av| 久久精品亚洲热| 欧美亚洲一区| 国内精品嫩模av私拍在线观看| 久久精品视频免费播放| 欧美在线视频观看| 国内精品久久久久影院色 | 欧美国产精品劲爆| 亚洲免费电影在线| 亚洲裸体在线观看| 国产精品高清在线观看| 亚洲字幕一区二区| 亚洲欧美国产另类| 国内精品一区二区| 麻豆av福利av久久av| 免费不卡亚洲欧美| 一二三区精品| 亚洲网站在线| 国产一级揄自揄精品视频| 久久综合给合久久狠狠色| 久久久天天操| 亚洲精品偷拍| 亚洲网站在线观看| 国产曰批免费观看久久久| 欧美不卡三区| 欧美日韩国产综合视频在线观看| 亚洲综合成人婷婷小说| 欧美亚洲综合久久| 亚洲福利视频二区| 99精品欧美一区| 国产亚洲精品一区二区| 欧美激情第二页| 国产精品v一区二区三区| 久久精品一区二区| 欧美国产在线观看| 欧美一区不卡| 欧美va亚洲va日韩∨a综合色| 亚洲制服av| 久久久久成人精品| 一区二区三区视频在线看| 午夜一区二区三区在线观看| …久久精品99久久香蕉国产| 亚洲精品一区二区三区av| 国产欧美日韩不卡| 亚洲国产精品久久久久秋霞蜜臀 | 欧美精品久久久久a| 午夜视频精品| 欧美va天堂在线| 午夜一区二区三区不卡视频| 久久频这里精品99香蕉| 亚洲视频精选| 久久综合伊人77777| 亚洲在线免费| 欧美ab在线视频| 欧美一区二区三区精品 | 国产一区二区高清不卡| 亚洲激情自拍| 国语自产精品视频在线看一大j8| 亚洲精品久久视频| 狠狠色综合网| 亚洲婷婷综合久久一本伊一区| 亚洲国产精品第一区二区三区| 亚洲制服少妇| 在线一区二区三区四区五区| 久久久人成影片一区二区三区 | 日韩一级片网址| 久久国产福利| 欧美一区二区精品| 欧美屁股在线| 欧美激情欧美狂野欧美精品| 国产亚洲人成网站在线观看 | 美女脱光内衣内裤视频久久网站| 香蕉久久一区二区不卡无毒影院|