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

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>
            国产日韩欧美综合精品| 黑人巨大精品欧美黑白配亚洲| 亚洲精品美女在线观看播放| 欧美1区2区| 欧美在线视频观看免费网站| 久久精品噜噜噜成人av农村| 久久久国产精彩视频美女艺术照福利 | 国产亚洲精品bv在线观看| 国产日韩一区二区三区在线播放 | …久久精品99久久香蕉国产| 国产在线视频不卡二| 亚洲欧洲精品一区| 亚洲网站视频| 国产日韩欧美一区二区三区在线观看 | 国产精品私人影院| 国产深夜精品| 久久综合图片| 欧美电影在线免费观看网站| 亚洲美女av网站| 久久精品国产久精国产一老狼 | 亚洲精品美女| 国产精品美女久久久久久2018| 国产午夜亚洲精品羞羞网站 | 一区二区动漫| 久久天天躁狠狠躁夜夜av| 91久久综合| 欧美在线观看一区| 最新日韩精品| 午夜精品久久久久久久久久久久| 欧美精品一线| 影音先锋在线一区| 欧美一区国产一区| 亚洲美女91| 韩国免费一区| 亚洲精品国产精品乱码不99| 国产午夜精品理论片a级探花| 亚洲成人在线视频网站| 午夜亚洲一区| 国产欧美高清| 午夜久久影院| 一区二区三区高清在线| 免费人成精品欧美精品| 午夜精品久久久久久久99水蜜桃| 久久全国免费视频| 国产日韩精品一区二区三区| 欧美国产精品专区| 国产一区二区精品久久| 亚洲精品中文字| 亚洲激情一区二区三区| 欧美国产高清| 国产午夜精品美女毛片视频| 99精品久久久| 国产精品高清在线观看| 亚洲免费视频在线观看| 亚洲午夜精品在线| 国产精品yjizz| 午夜性色一区二区三区免费视频 | 99re国产精品| 国产精品久久毛片a| 亚洲国产精品一区二区第一页| 欧美福利电影网| 一区二区免费在线播放| 老司机午夜精品视频| 亚洲美女精品久久| 一区二区久久久久| 日韩性生活视频| 一本大道久久a久久精品综合| 亚洲精品国产精品国自产在线| 亚洲精选视频在线| 亚洲人线精品午夜| 欧美成人免费全部| 亚洲欧美日本在线| 国产精品高潮呻吟久久av无限| 亚洲欧洲久久| 正在播放亚洲一区| 欧美性生交xxxxx久久久| 亚洲美女毛片| 亚洲图片欧美日产| 国产精品久久久久久久第一福利| aaa亚洲精品一二三区| 亚洲深夜av| 国产精品家庭影院| 性xx色xx综合久久久xx| 久久精品99| 欧美国产综合一区二区| 亚洲精品日韩激情在线电影| 99精品久久| 国产精品久久久久7777婷婷| 亚洲欧美成人一区二区三区| 最新中文字幕一区二区三区| 欧美久久在线| 一区二区三区久久精品| 欧美在线电影| 亚洲国产精品一区制服丝袜| 亚洲视频成人| 亚洲激情综合| 欧美视频官网| 欧美激情视频一区二区三区在线播放| 欧美久久视频| 亚洲一区二区三区欧美| 亚洲美女在线观看| 国产精品va在线播放| 先锋亚洲精品| 欧美sm重口味系列视频在线观看| 国产亚洲精品久久久久婷婷瑜伽| 久久久高清一区二区三区| 亚洲国产乱码最新视频| 欧美亚洲三级| 国产精品扒开腿做爽爽爽视频| 午夜在线一区| 亚洲精品中文字幕女同| 久久久99爱| 国内精品久久久久国产盗摄免费观看完整版| 久久久久久久久综合| 欧美在线播放高清精品| 亚洲激情网址| 国产麻豆精品久久一二三| 一区二区三区欧美| 免费观看国产成人| 红桃视频成人| 欧美视频中文在线看| 久久精品欧美日韩精品| 亚洲视频大全| 亚洲激情视频网| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲午夜免费视频| 亚洲精品久久久久久久久| 国产一区二区三区四区五区美女 | 亚洲影院免费观看| 欧美高清在线一区| 欧美中日韩免费视频| 国产日韩欧美成人| 欧美人在线观看| 久久一二三国产| 午夜精品久久久久久久蜜桃app | 亚洲激情网站| 久久午夜精品| 性欧美video另类hd性玩具| 亚洲日本中文字幕区| 一区二区三区在线视频播放| 美女性感视频久久久| 欧美激情小视频| 另类激情亚洲| 久久久久一本一区二区青青蜜月| 在线看无码的免费网站| 国产一区二区久久| 国产精品综合视频| 国产精品中文字幕在线观看| 欧美亚州一区二区三区| 欧美日韩精品一区二区| 欧美一级夜夜爽| 欧美激情小视频| 亚洲成人资源网| 91久久国产综合久久| 亚洲啪啪91| 一本色道久久综合亚洲91| 日韩午夜精品| 一区二区三区av| 亚洲在线中文字幕| 欧美一乱一性一交一视频| 亚洲欧美日韩国产一区| 欧美一区视频在线| 久久婷婷影院| 女人天堂亚洲aⅴ在线观看| 欧美成人午夜影院| 欧美日韩综合另类| 国产精品亚洲美女av网站| 国产午夜精品久久久久久久| 影音先锋另类| 亚洲美女视频| 香蕉成人久久| 美女诱惑一区| 亚洲日韩中文字幕在线播放| 亚洲少妇最新在线视频| 亚洲伊人伊色伊影伊综合网| 久久久久免费视频| 欧美日韩亚洲一区二区三区| 久久人人97超碰人人澡爱香蕉| 蜜月aⅴ免费一区二区三区| 欧美美女bbbb| 国产视频在线一区二区 | 欧美成人三级在线| 国产精品盗摄久久久| 国内精品免费在线观看| 日韩一区二区精品在线观看| 亚洲欧美在线观看| 欧美不卡激情三级在线观看| 99国产精品久久久久久久| 午夜亚洲一区| 欧美日产在线观看| 黄色国产精品| 亚洲视频网在线直播| 美女视频黄 久久| 亚洲视频一二| 欧美二区乱c少妇| 国产日本欧美一区二区| 亚洲伦理网站| 久久免费国产| 亚洲一区二区三区乱码aⅴ| 男女视频一区二区|