• <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
            #include<iostream>
            using namespace std;
            //求單源最小路徑,不妨設(shè)源點(diǎn)為1,算法思想是
            //從未訪問(wèn)的頂點(diǎn)中選擇dv最小的點(diǎn)(d為從該點(diǎn)到源點(diǎn)0的距離)令arcs[v][v]=1
            //考慮v的所有鄰接頂點(diǎn)w,不斷嘗試若dv+weight(v,w)<dw,則改變dw值
            //這里選擇dv最小的很關(guān)鍵,因?yàn)樽钚。钥隙ㄊ亲疃搪窂?,其他的d會(huì)不斷更新。
             #define  MaxVertx 100//最多邊長(zhǎng)度
             #define MAX 1e+8
             typedef char vertextype;
             typedef float adjtype;
             typedef struct{
              int n;//頂點(diǎn)個(gè)數(shù)
              vertextype vertex[MaxVertx];
              adjtype arcs[MaxVertx][MaxVertx];//鄰接矩陣形式
             }Graph;
             typedef struct{
              vertextype vertex;//頂點(diǎn)信息
              adjtype length;//最小長(zhǎng)度 
              int  prev;//最短路徑上前驅(qū)結(jié)點(diǎn)編號(hào)
             }Path;
             Path dist[MaxVertx];
             Graph graph;
             void init(Graph *pgraph,Path dist[])
             {
              int i;
              dist[0].length=0;
              dist[0].prev=0;
              dist[0].vertex=pgraph->vertex[0];//第一個(gè)頂點(diǎn)的名稱/編號(hào)
              pgraph->arcs[0][0]=1; /* 表示頂點(diǎn)v0在集合U中 */
              
               for(i = 1; i < pgraph->n; i++)              /* 初始化集合V-U中頂點(diǎn)的距離值 */
                {
                dist[i].length=pgraph->arcs[0][i];
                dist[i].vertex=pgraph->vertex[i];
                if(dist[i].length!=MAX)
                     dist[i].prev=0;
                else
                     dist[i].prev=-1;            
                }
             }
             void dijkstra(Graph graph,Path dist[])
             {
              int i,j,minvex;
              adjtype min;
              init(&graph,dist); /* 初始化,此時(shí)集合U中只有頂點(diǎn)v0*/
              for(i=1;i<graph.n;i++)//每個(gè)dist[]都要求 不一定會(huì)執(zhí)行n次,可能會(huì)break出來(lái)
              {
               min=MAX;
               minvex=0;
               for(j=1;j<graph.n;j++)/*在VU中選出距離值最小頂點(diǎn)*/
               if(graph.arcs[j][j]==0&&dist[j].length<min)
               {
                min=dist[j].length;
                minvex=j;
               }
               if(minvex==0)break;/* 從v0沒(méi)有路徑可以通往集合VU中的頂點(diǎn) */
               graph.arcs[minvex][minvex]=1;//表示已經(jīng)訪問(wèn)過(guò)了,不屬于VU集合
               for(j=1;j<graph.n;j++)
               {
                if(graph.arcs[j][j]==1)continue;
                if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j])//如果不相鄰,則arcs[minvex][minvex]=+無(wú)窮
                {
                            dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
                            dist[j].prev = minvex;
                    }
               }
              }
             }
             void initgraph()//初始化矩陣
             {
             int i,j;
                graph.n=6;
                for (i = 0; i < graph.n; i++)
                    for (j = 0; j < graph.n; j++)
                        graph.arcs[i][j] = (i == j ? 0 : MAX);
                graph.arcs[0][1] = 50;
                graph.arcs[0][2] = 10;
                graph.arcs[1][2] = 15;
                graph.arcs[1][4] = 5;
                graph.arcs[2][0] = 20;
                graph.arcs[2][3] = 15;
                graph.arcs[3][1] = 20;
                graph.arcs[3][4] = 35;
                graph.arcs[4][3] = 30;
                graph.arcs[5][3] = 3;
                graph.arcs[0][4] = 45; 
             }
              int main()
              {
              //freopen("s.txt","r",stdin);
              //freopen("key.txt","w",stdout);
               int i;
                initgraph();
                dijkstra(graph, dist);
                for (i = 0; i < graph.n; i++)
                    printf("(%.0f %d)", dist[i].length,dist[i].prev);
                getchar();
             return 0;
              }
            posted on 2009-08-09 11:19 luis 閱讀(1604) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 圖論*矩陣

            FeedBack:
            # re: dijkstra的鄰接表實(shí)現(xiàn)[未登錄](méi)
            2012-04-26 14:38 | alex
            這是鄰接矩陣好嗎?  回復(fù)  更多評(píng)論
              
            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久久久97| 伊人久久无码中文字幕| 久久99国产精品成人欧美| 国产精品伊人久久伊人电影| 中文字幕精品无码久久久久久3D日动漫 | 亚洲国产精品无码久久久久久曰 | 欧美午夜精品久久久久免费视 | 久久99精品久久久久久水蜜桃| 欧美午夜精品久久久久久浪潮| 中文字幕热久久久久久久| 日本久久久精品中文字幕| 老男人久久青草av高清| 精品久久久久久亚洲| 中文无码久久精品| 日韩欧美亚洲综合久久影院Ds| 日本强好片久久久久久AAA| 久久无码一区二区三区少妇 | 亚洲精品国产综合久久一线| 久久国产精品99精品国产| 国产精品久久新婚兰兰| 很黄很污的网站久久mimi色| 久久精品国产精品青草app| 中文字幕久久久久人妻| 精品久久久久久久久免费影院| 欧美久久综合性欧美| 久久精品国产亚洲av麻豆小说| 久久久无码精品亚洲日韩蜜臀浪潮| 一级做a爰片久久毛片16| 狠狠色丁香久久婷婷综合五月 | 狠狠综合久久AV一区二区三区| 久久亚洲2019中文字幕| 国产激情久久久久影院| 国产成人综合久久精品尤物| 香蕉久久夜色精品国产小说| 精品亚洲综合久久中文字幕| 久久精品国产99国产精偷| 999久久久无码国产精品| 久久精品麻豆日日躁夜夜躁| 久久久久久久久久久久中文字幕 | 久久夜色精品国产| 亚洲精品无码久久久|