• <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>
            posts - 195,  comments - 30,  trackbacks - 0
             Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。Dijkstra算法是很有代表性的最短路徑算法,在很多專(zhuān)業(yè)課程中都作為基本內(nèi)容有詳細(xì)的介紹,如數(shù)據(jù)結(jié)構(gòu),圖論,運(yùn)籌學(xué)等等。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時(shí)標(biāo)號(hào)方式,一種是用OPEN, CLOSE表的方式,這里均采用永久和臨時(shí)標(biāo)號(hào)的方式。注意該算法要求圖中不存在負(fù)權(quán)邊。

            問(wèn)題描述

              在無(wú)向圖 G=(V,E) 中,假設(shè)每條邊 E[i] 的長(zhǎng)度為 w[i],找到由頂點(diǎn) V0 到其余各點(diǎn)的最短路徑。(單源最短路徑 


             迪杰斯特拉(Dijkstra)算法思想
              
            按路徑長(zhǎng)度遞增次序產(chǎn)生最短路徑算法:
              把V分成兩組:
             ?。?)S:已求出最短路徑的頂點(diǎn)的集合
             ?。?)V-S=T:尚未確定最短路徑的頂點(diǎn)集合
              將T中頂點(diǎn)按最短路徑遞增的次序加入到S中,
              保證:(1)從源點(diǎn)V0到S中各頂點(diǎn)的最短路徑長(zhǎng)度都不大于
              從V0到T中任何頂點(diǎn)的最短路徑長(zhǎng)度
              (2)每個(gè)頂點(diǎn)對(duì)應(yīng)一個(gè)距離值
              S中頂點(diǎn):從V0到此頂點(diǎn)的最短路徑長(zhǎng)度
              T中頂點(diǎn):從V0到此頂點(diǎn)的只包括S中頂點(diǎn)作中間
              頂點(diǎn)的最短路徑長(zhǎng)度
              依據(jù):可以證明V0到T中頂點(diǎn)Vk的最短路徑,或是從V0到Vk的
              直接路徑的權(quán)值;或是從V0經(jīng)S中頂點(diǎn)到Vk的路徑權(quán)值之和
             ?。ǚ醋C法可證)
              求最短路徑步驟
              算法步驟如下:
              1. 初使時(shí)令 S={V0},T={其余頂點(diǎn)},T中頂點(diǎn)對(duì)應(yīng)的距離值
              若存在<V0,Vi>,d(V0,Vi)為<V0,Vi>弧上的權(quán)值
              若不存在<V0,Vi>,d(V0,Vi)為∝
              2. 從T中選取一個(gè)其距離值為最小的頂點(diǎn)W且不在S中,加入S
              3. 對(duì)T中頂點(diǎn)的距離值進(jìn)行修改:若加進(jìn)W作中間頂點(diǎn),從V0到Vi的
              距離值比不加W的路徑要短,則修改此距離值
              重復(fù)上述步驟2、3,直到S中包含所有頂點(diǎn),即S=T為止 

            代碼: 源地址:www.cnblogs.com/newwy 

            /*********************************
            *   最短路徑---Dijkstra算法實(shí)現(xiàn) 
            *      HDU:2544 
            *   BLOG:www.cnblogs.com/newwy
            *   AUTHOR:Wang Yong
            *********************************
            */
            #include <iostream>
            #define MAX 100
            #define INF 1000000000
            using namespace std;
             int dijkstra (int mat[][MAX],int n, int s,int f)
             {
                 int dis[MAX];
                 int mark[MAX];//記錄被選中的結(jié)點(diǎn) 
                 int i,j,k = 0;
                 for(i = 0 ; i < n ; i++)//初始化所有結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都沒(méi)有被選中 
                     mark[i] = 0;
                for(i = 0 ; i < n ; i++)//將每個(gè)結(jié)點(diǎn)到start結(jié)點(diǎn)weight記錄為當(dāng)前distance 
                {
                    dis[i] = mat[s][i];
                    //path[i] = s;
                }
                mark[s] = 1;//start結(jié)點(diǎn)被選中 
                
            //path[s] = 0;
                dis[s] = 0;//將start結(jié)點(diǎn)的的距離設(shè)置為0 
                int min ;//設(shè)置最短的距離。 
                for(i = 1 ; i < n; i++)
                {
                    min = INF;
                    for(j = 0 ; j < n;j++)
                    {
                        if(mark[j] == 0  && dis[j] < min)//未被選中的結(jié)點(diǎn)中,距離最短的被選中 
                        {
                            min = dis[j] ;
                            k = j;
                        }
                    }
                    mark[k] = 1;//標(biāo)記為被選中 
                    for(j = 0 ; j < n ; j++)
                    {
                        if( mark[j] == 0  && (dis[j] > (dis[k] + mat[k][j])))//修改剩余結(jié)點(diǎn)的最短距離 
                        {
                            dis[j] = dis[k] + mat[k][j];
                        }
                    }
                }
                return dis[f];    
             } 
             int mat[MAX][MAX];
            int main()
            {
                int n,m;
                while(scanf("%d %d",&n,&m))
                {
                    int a,b,dis;
                    if(n == 0 || m == 0)
                        break;
                    int i,j;
                    for(i = 0 ; i < n;i++)
                        for(j = 0 ; j < n; j++)
                            mat[i][j] = INF;
                    for(i = 0 ; i < m ;i++)
                    {
                        scanf("%d %d %d",&a,&b,&dis);
                        --a,--b;
                        if(dis < mat[a][b] || dis < mat[b][a])
                        mat[a][b] = mat[b][a] = dis;
                    }
                    int ans = dijkstra(mat,n,0,n-1);
                    printf("%d\n",ans);
                }
             
            }

            可用 優(yōu)先隊(duì)列優(yōu)化


            其他解釋?zhuān)?br />http://blog.csdn.net/jiahui524/article/details/6636913 
            posted on 2012-06-16 03:53 luis 閱讀(548) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 圖論*矩陣
            <2012年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            友情鏈接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            91亚洲国产成人久久精品| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 色8久久人人97超碰香蕉987| 日本久久久久亚洲中字幕| 青青草原综合久久大伊人精品| 久久免费观看视频| 国产精品无码久久综合| 中文字幕久久亚洲一区| 精品亚洲综合久久中文字幕| 欧美亚洲国产精品久久| 精品国产99久久久久久麻豆| 国产精品久久久久天天影视| 久久天天躁狠狠躁夜夜avapp| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产精品久久久久久影院 | 2020最新久久久视精品爱| 亚洲午夜久久久| 国产精品亚洲综合专区片高清久久久 | 91麻豆国产精品91久久久| 国产69精品久久久久99尤物| 人妻精品久久久久中文字幕一冢本| 久久久久久青草大香综合精品| 久久天天躁狠狠躁夜夜躁2O2O| 2021国内精品久久久久久影院| 久久国产香蕉视频| 99久久精品国产一区二区| 99久久精品国产免看国产一区| 久久精品国产2020| 久久婷婷色香五月综合激情| 麻豆久久| 国产精品久久久久久五月尺| 久久久精品国产Sm最大网站| 久久国产精品一区| 久久精品成人免费观看97| 精品久久人人爽天天玩人人妻| 亚洲午夜精品久久久久久人妖| 国产精品免费福利久久| 精品久久久久久久久午夜福利| 久久天天躁狠狠躁夜夜躁2O2O| 日韩久久久久久中文人妻| 久久久久免费看成人影片|