• <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(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法是很有代表性的最短路徑算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均采用永久和臨時標號的方式。注意該算法要求圖中不存在負權邊。

            問題描述

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


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

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

            /*********************************
            *   最短路徑---Dijkstra算法實現 
            *      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];//記錄被選中的結點 
                 int i,j,k = 0;
                 for(i = 0 ; i < n ; i++)//初始化所有結點,每個結點都沒有被選中 
                     mark[i] = 0;
                for(i = 0 ; i < n ; i++)//將每個結點到start結點weight記錄為當前distance 
                {
                    dis[i] = mat[s][i];
                    //path[i] = s;
                }
                mark[s] = 1;//start結點被選中 
                
            //path[s] = 0;
                dis[s] = 0;//將start結點的的距離設置為0 
                int min ;//設置最短的距離。 
                for(i = 1 ; i < n; i++)
                {
                    min = INF;
                    for(j = 0 ; j < n;j++)
                    {
                        if(mark[j] == 0  && dis[j] < min)//未被選中的結點中,距離最短的被選中 
                        {
                            min = dis[j] ;
                            k = j;
                        }
                    }
                    mark[k] = 1;//標記為被選中 
                    for(j = 0 ; j < n ; j++)
                    {
                        if( mark[j] == 0  && (dis[j] > (dis[k] + mat[k][j])))//修改剩余結點的最短距離 
                        {
                            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);
                }
             
            }

            可用 優先隊列優化


            其他解釋:
            http://blog.csdn.net/jiahui524/article/details/6636913 
            posted on 2012-06-16 03:53 luis 閱讀(548) 評論(0)  編輯 收藏 引用 所屬分類: 圖論*矩陣
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品美女久久久久网| 99久久国产宗和精品1上映| 91精品国产91久久综合| 日本福利片国产午夜久久| 久久久久国产亚洲AV麻豆| 少妇内射兰兰久久| 国产精品99久久久久久www| 青草久久久国产线免观| 亚洲αv久久久噜噜噜噜噜| 色成年激情久久综合| 一级a性色生活片久久无少妇一级婬片免费放 | 色综合色天天久久婷婷基地| 久久精品国产亚洲AV麻豆网站| 91精品国产91久久久久久蜜臀| 偷窥少妇久久久久久久久| 狠狠狠色丁香婷婷综合久久俺| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久99国产精品99久久| 久久96国产精品久久久| 久久久久久久精品成人热色戒| 久久香蕉一级毛片| 中文精品99久久国产 | 日韩精品无码久久久久久| 久久无码人妻精品一区二区三区| 久久综合狠狠综合久久综合88 | 色综合久久最新中文字幕| 亚洲AV无码久久精品蜜桃| 久久久久亚洲AV无码去区首| 久久99精品国产自在现线小黄鸭 | 精品99久久aaa一级毛片| 久久久久亚洲AV无码麻豆| 精品多毛少妇人妻AV免费久久| 精品国产乱码久久久久久浪潮| 久久精品国产影库免费看| 国产精品久久久久AV福利动漫 | 波多野结衣中文字幕久久| 亚洲AV日韩AV永久无码久久| 久久亚洲国产最新网站| 亚洲国产成人久久笫一页| 久久久久一本毛久久久| 久久播电影网|