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

The Fourth Dimension Space

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

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

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

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

1.       設最小樹形圖的總權值為cost,置cost0

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

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

4.       將有向環縮成一個點。設環中有點{Vk1,Vk2,…,Vki}i個點,用Vk代替縮成的點。在壓縮后的圖中,更新所有不在環中的點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中有向邊的權值總和就是最小樹形圖的權值總和。

源代碼如下:(參考了網上的代碼)
#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];//記錄該節點的前驅
double graph[200][200], ans;//圖數組和結果
bool   visit[110], circle[110];//visit記錄該點有沒有被訪問過,circle記錄改點是不是在一個圈里
int    n, m, root;//頂點數+邊數+根節點標號

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

}


bool check()//這個函數用來檢查最小樹形圖是否存在,即如果存在,那么一遍dfs后,應該可以遍歷到所有的節點
{
    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循環負責找出所有非根節點的前驅節點
    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 )//縮圈之后更新數據
{
    
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;
    }
//首先把圈里的邊權全部加起來,并且留出t節點,作為外部接口
    
    
for(i= 1; i<= n; ++i )
        
if!circle[i] && graph[i][t]!= INF )
            graph[i][t]
-= graph[pre[t]][t];
    
//上面這個for循環的作用是對t節點做更新操作,為什么要單獨做?你可以看看線面這個循環的跳出條件。
    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] );
        }

    
//這個循環對圈中的其他頂點進行更新
}


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 淘寶網首頁

學習!學習~~  回復  更多評論   

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

這個算法應該叫Chu-Liu-Edmond算法吧!  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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| 午夜精品福利一区二区三区av| 亚洲高清资源| 国产一区自拍视频| 伊人久久大香线蕉综合热线| 国产一区二区日韩精品欧美精品| 国产精品一区2区| 国产欧美精品一区二区三区介绍| 国产精品国色综合久久| 国产精品一区二区久久精品| 国产精品女主播在线观看| 国产日韩视频| 亚洲电影观看| 一区二区三区鲁丝不卡| 亚洲一区二区视频| 久久久国产一区二区三区| 老司机免费视频一区二区三区| 欧美高清在线观看| 一区二区三区av| 亚洲精品一区二区三区不| 欧美在线观看一区| 久久理论片午夜琪琪电影网| 欧美精品色网| 国产欧美日韩视频一区二区三区| 亚洲成色777777女色窝| 亚洲最新合集| 久久丁香综合五月国产三级网站| 美女视频黄 久久| 最新国产乱人伦偷精品免费网站 | 亚洲欧洲另类国产综合| 夜久久久久久| 久久久久久久久久久一区| 欧美精品18+| 国产精品久久久久久影视| 国产亚洲欧美色| 中文国产成人精品| 欧美大秀在线观看| 午夜视频一区在线观看| 欧美另类高清视频在线| 激情综合电影网| 西西人体一区二区| 亚洲裸体视频| 欧美成人中文字幕在线| 国产在线观看一区| 亚洲主播在线观看| 亚洲日韩欧美视频一区| 久久亚洲欧美| 韩国精品一区二区三区| 亚洲欧美中文字幕| 亚洲欧洲在线免费| 麻豆精品一区二区av白丝在线| 国产伦精品一区二区三区视频孕妇 | 欧美一级电影久久| 国产精品国产精品| 一本色道久久综合亚洲二区三区| 另类图片国产| 西瓜成人精品人成网站| 国产精品日韩一区二区| 亚洲午夜日本在线观看| 亚洲国产日韩综合一区| 欧美成人精品| 亚洲精品一二三| 亚洲国产成人精品女人久久久 | 欧美丝袜第一区| 中文一区在线| 夜夜狂射影院欧美极品| 欧美区高清在线| aa日韩免费精品视频一| 最新亚洲激情| 欧美日韩精品一区| 亚洲一区在线免费| 亚洲伦理精品| 欧美性色视频在线| 国产一区视频网站| 小嫩嫩精品导航| 亚洲一区精彩视频| 国产情人节一区| 欧美一级视频免费在线观看| 亚洲一区视频在线| 国产亚洲精品自拍| 免费视频亚洲| 欧美精品三区| 亚洲欧美一区二区三区在线| 亚洲欧美日韩直播| 国产午夜精品久久久久久免费视| 午夜精品一区二区三区四区| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品欧美久久| 久久久精品性| 欧美国产极速在线| 亚洲女女女同性video| 亚洲综合精品自拍| 在线看片第一页欧美| 亚洲精品乱码久久久久久日本蜜臀| 欧美色图一区二区三区| 欧美中文字幕视频| 美女视频网站黄色亚洲| 一本久久精品一区二区| 亚洲欧美视频在线观看视频| 亚洲成色精品| 一区二区精品在线| 狠狠色综合色区| 亚洲精品日本| 伊人久久大香线| 亚洲少妇在线| 亚洲成色999久久网站| 宅男精品视频| 亚洲精美视频| 午夜精品视频在线| 99国产麻豆精品| 久久成人18免费网站| 在线亚洲自拍| 久热精品在线| 久久久噜噜噜久久人人看| 欧美日韩亚洲91| 欧美高清不卡在线| 国产一区二区三区网站| 亚洲精品黄色| 在线观看av不卡| 午夜精品国产更新| 亚洲午夜伦理| 欧美国产日韩一区二区| 久久综合色天天久久综合图片| 欧美日韩精品免费观看视一区二区| 久久精品最新地址| 国产精品国产三级国产专区53| 亚洲电影自拍| 亚洲第一狼人社区| 久久爱www久久做| 久久av一区| 国产精品天天看| 亚洲最新在线| 99视频精品免费观看| 久久天堂成人| 欧美亚男人的天堂| 亚洲在线免费| 欧美精品在线免费观看| 欧美电影在线观看完整版| 激情91久久| 久久久国产精品亚洲一区| 久久精品日产第一区二区| 欧美午夜电影网| 一区二区三区免费在线观看| 宅男噜噜噜66一区二区| 欧美日韩国产精品自在自线| 亚洲欧洲精品一区二区三区不卡| 影音先锋亚洲视频| 久久精品99无色码中文字幕| 久久九九精品99国产精品| 国产综合精品| 久久香蕉精品| 亚洲国产清纯| 国产精品99久久久久久www| 欧美午夜不卡在线观看免费| 夜夜嗨av一区二区三区四区| 亚洲免费在线| 国产偷久久久精品专区| 久久婷婷国产综合精品青草| 欧美成人一区二区三区在线观看| 尤物yw午夜国产精品视频| 美国十次成人| 99国产精品私拍| 久久国产精品一区二区三区| 国产一区二区三区的电影| 久久久国产午夜精品| 亚洲激情视频在线播放| 亚洲永久免费| 精品二区视频| 欧美日韩一区二区三| 亚洲欧美美女| 欧美高清视频一区二区| 亚洲一区二区伦理| 激情久久中文字幕| 欧美激情视频在线播放| 亚洲综合色婷婷| 亚洲第一网站| 欧美一区二区三区四区在线观看地址| 国产一区二区看久久| 欧美高清视频一区二区| 亚洲欧美国产三级| 亚洲国产毛片完整版| 欧美在线免费观看| 亚洲免费不卡| 精品成人一区二区三区四区| 欧美日韩国产成人在线| 久久久国产午夜精品| 一区二区三区久久精品| 欧美激情第一页xxx| 欧美伊久线香蕉线新在线| 夜色激情一区二区| 精品成人乱色一区二区| 国产精品综合| 欧美日韩美女| 免费成人网www| 午夜欧美精品久久久久久久| 亚洲激情网站| 免费视频亚洲| 久久久噜噜噜久久中文字幕色伊伊| 一区二区高清在线观看| 91久久精品国产91久久性色|