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

The Fourth Dimension Space

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

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

所謂的最小樹形圖,就是讓你在一個有向圖中找一個根和由根擴展出來的一顆有向的生成樹,并且使這棵樹的權(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)對圈中的其他頂點進行更新
}


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 閱讀(2189) 評論(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>
            亚洲一级二级| 欧美专区日韩专区| 欧美日韩国产精品一区| 久久久欧美一区二区| 欧美一区二区高清| 久久久久国产免费免费| 老司机成人网| 欧美日韩免费观看一区三区| 欧美日韩一区不卡| 国产精品欧美激情| 国产一区日韩二区欧美三区| 亚洲第一福利在线观看| 日韩视频精品在线| 欧美在线观看视频一区二区| 久久亚洲精品一区| 亚洲人永久免费| 一本色道久久综合亚洲精品按摩| 99re66热这里只有精品4| 亚洲影院色在线观看免费| 欧美一区二区免费| 欧美高清一区| 国产一区二区三区精品欧美日韩一区二区三区 | 在线观看日韩国产| 一区二区久久久久| 久久久久久久激情视频| 最新国产成人在线观看| 亚洲一区二区高清视频| 老妇喷水一区二区三区| 欧美丝袜第一区| 曰本成人黄色| 午夜亚洲一区| 91久久精品美女| 久久精品亚洲精品| 欧美视频你懂的| 亚洲丰满在线| 久久精品成人一区二区三区蜜臀| 亚洲成人资源| 久久精品91| 欧美视频精品在线观看| 亚洲国产成人porn| 久久久在线视频| 亚洲欧美日韩人成在线播放| 欧美成人嫩草网站| 亚洲深夜影院| 欧美日韩中文另类| 亚洲区第一页| 美腿丝袜亚洲色图| 欧美一级黄色录像| 欧美新色视频| 亚洲视频精品在线| 亚洲精品国产视频| 免费亚洲电影在线观看| 尤物99国产成人精品视频| 欧美一区二区私人影院日本 | 国产亚洲日本欧美韩国| 亚洲视频在线播放| 日韩视频免费| 欧美日韩亚洲综合| 中国成人黄色视屏| 最新日韩中文字幕| 欧美日韩1234| 99精品欧美一区| 亚洲日本黄色| 欧美日韩中文字幕在线视频| 亚洲精品免费电影| 亚洲清纯自拍| 国产精品v欧美精品v日韩精品| 日韩午夜av在线| 日韩一级大片在线| 国产伦一区二区三区色一情| 欧美在线播放视频| 久久嫩草精品久久久精品一| 亚洲国产一成人久久精品| 欧美大胆a视频| 欧美日本不卡高清| 午夜精品久久久久久久久| 午夜精品在线| 亚洲国产成人精品女人久久久| 亚洲成色www8888| 欧美日韩国产精品 | 亚洲国产精品一区二区第一页| 久久网站热最新地址| 亚洲国产二区| 在线亚洲免费视频| 狠狠色综合色综合网络| 欧美成人免费观看| 欧美日韩色婷婷| 欧美中文字幕第一页| 久久久99国产精品免费| 亚洲免费成人av电影| 亚洲一区二区在线观看视频| 国内激情久久| 亚洲欧洲另类| 国产三级精品三级| 亚洲国产小视频在线观看| 国产精品人人做人人爽人人添| 久久综合久久综合久久综合| 欧美成va人片在线观看| 亚洲永久免费观看| 麻豆久久婷婷| 久久精品欧美日韩精品| 亚洲麻豆视频| 国产偷久久久精品专区| 欧美激情中文字幕在线| 国产精品中文字幕欧美| 亚洲国产精品第一区二区| 国产精品一卡| 亚洲精品在线视频观看| 国产综合在线看| 一区二区三区欧美亚洲| 亚洲第一成人在线| 欧美一级黄色录像| 亚洲欧美日韩综合aⅴ视频| 美女久久一区| 久久午夜色播影院免费高清| 欧美人在线观看| 欧美国产精品va在线观看| 国产日本欧美在线观看| aa成人免费视频| 亚洲伦理中文字幕| 久久天堂成人| 久久久91精品国产一区二区三区| 欧美日韩国产成人在线91| 免费久久精品视频| 国自产拍偷拍福利精品免费一| 在线中文字幕日韩| 在线午夜精品| 欧美日韩视频在线| 亚洲国产婷婷| 亚洲伦理在线观看| 欧美高清不卡| 亚洲国产网站| 99这里有精品| 欧美日韩国产综合网 | 欧美三区在线视频| 亚洲欧洲一区| 亚洲人成网站777色婷婷| 久久频这里精品99香蕉| 另类成人小视频在线| 国产亚洲福利| 久久精品国产一区二区三| 久久精视频免费在线久久完整在线看| 国产精品亚洲片夜色在线| 亚洲男女自偷自拍| 久久精品视频va| 影音先锋中文字幕一区| 美女精品在线观看| 亚洲精品一区二区三区蜜桃久| 99视频精品全国免费| 欧美午夜女人视频在线| 亚洲伊人伊色伊影伊综合网| 久久激情视频久久| 极品尤物久久久av免费看| 久久午夜电影网| 亚洲精品自在在线观看| 香蕉久久夜色精品国产使用方法| 国产精品日韩欧美一区二区三区 | 欧美r片在线| 亚洲精品一区二区网址 | 一区二区三区自拍| 另类专区欧美制服同性| 亚洲激情一区二区| 午夜精品福利在线观看| 国外精品视频| 欧美日韩国产免费| 久久久久久久久一区二区| 一本色道88久久加勒比精品| 欧美日韩日本视频| 香蕉av福利精品导航| 欧美成人网在线| 在线视频欧美精品| 国产视频欧美视频| 欧美精品www| 欧美一区二区三区视频| 亚洲国产日韩欧美在线图片| 亚洲欧美国产另类| 亚洲国产日韩在线| 国产欧美日韩一区| 欧美福利一区二区| 久久精品久久综合| 亚洲视频一区| 亚洲国产成人av| 久久精品国产精品亚洲| 99精品黄色片免费大全| 国产日韩av在线播放| 欧美精品免费视频| 久久久久久91香蕉国产| 一本久久综合亚洲鲁鲁五月天| 久久婷婷国产综合精品青草| 一区二区三区四区五区在线| 国语自产在线不卡| 国产精品一区二区三区观看| 欧美激情综合五月色丁香| 欧美一区二区三区视频免费| 夜夜嗨av一区二区三区网页| 美女网站久久| 久久激情视频久久| 欧美亚洲免费高清在线观看| 一区二区三区你懂的| 亚洲人成在线观看|