• <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 - 25,  comments - 36,  trackbacks - 0
            #include <iostream>
            #include <stdio.h>
            using namespace std;

            #define  MAXVEX 100
            #define  INF    6000

            //定義比較的數字 表示無窮大 只要比你圖中的權值運算涉及的值要大就可以了

             
            /************************************************************************/
            /*                          Dijkstra 算法思想
            /* 1: 基本思想就是貪心法(核心思想) --->在寫代碼時候再說
            /* 2: 這里就是找出源點到各個點最短距離 然后用這個最短距離+源點到另外一個點距離 如果< 就修改值這樣不斷修改就得出了                                                                      
            /************************************************************************/
            void Dijkstra(int graph[][MAXVEX],int startVex,int VexNum)
            {
            int path[MAXVEX] = {-1}; //保存最終點最短路徑的前一個點
            int dist[MAXVEX] = {0};
            int s[MAXVEX] = {0}; //標志是否在s的集合中--> 這里要涉及到Dijkstra 算法思想

            int i,j,min = INF;

            s[startVex] = 1; //把startvex 選到s集合中去 -->這里為下面選擇最小值服務了 放在這里代碼思路清晰點
            for( i = 0; i < VexNum; i++)
            {
            dist[i] = graph[startVex][i] ; //這里就是開始貪心了 認為 startVex ---> 各個定點距離現在就是最短了。
            if(dist[i] < INF)
            {
            path[i] = startVex; //保存到i 最短路徑的前一個定點
            }
            else
            {
            path[i] = -1;
            }
            }

            for(j = 0; j < VexNum; j++)
            {
            int min = INF;
            int uVex = -1; //保存從沒有選過的點中距離最短的點
            for( i = 0; i < VexNum; i++)
            {
            if(s[i] == 0) //過濾條件--->把選擇的點過濾掉
            {
            if( min > dist[i])
            {
            min = dist[i];
            uVex = i;
            }
            }
            }
            //這樣就得到一個頂點了
            if(uVex != -1)//為什么要判斷 因為 你可能沒有最小的選擇 但還在循環中的處理
            {
            s[uVex] = 1; //加入s集合 不加就會出現重復選擇一個點 --->顯然這樣結果肯定是不對的
            for(i = 0; i < VexNum; i++) //這里就是在修改dist 最短距離的值了 有可能幾個點 比你直接2個點要短
            {//我們只要dist[i]+dist[j] < dist[j] 距離就可以了
            if(s[i] == 0)///dist[i] 是dist 最短的 這里就體現了貪心法了。
            {
            if(dist[i] > dist[uVex] + graph[uVex][i])
            {
            path[i] = uVex; //保存到達i 點 最短距離的前一個點
            dist[i] = dist[uVex] + graph[uVex][i];
            }
            }
            }
            }
            }

            cout<<"打印Dijkstra"<<endl;

            /////////////////////////
            int stack[MAXVEX] = {0};
            int top = -1;
            //一個簡單棧
            /////////////////////////
            for(i = 0; i < VexNum; i++)
            {
            int pre = path[i]; //獲得到達i點最短路徑的前一個定點
            if(pre != -1)
            {
            cout<<"dist: "<<dist[i]<<endl;
            while(pre != startVex) //
            {
            stack[++top] = pre; //進棧
            pre = path[pre];
            }
            cout<<startVex<<"---->"<<i<<"路徑: ";
            cout<<startVex<<" ";
            while(top!=-1)
            {
            cout<<stack[top--]<<" ";
            }
            cout<<i<<endl;
            }
            else
            {
            cout<<startVex<<"--->"<<i<<"沒有路徑"<<endl;
            }
            }

            }

            int main()
            {
            int cost[6][MAXVEX] ={
            {0,50,10,INF,INF,INF},
            {INF,0,15,50,10,INF},
            {20,INF,0,15,INF,INF},
            {INF,20,INF,0,35,INF},
            {INF,INF,INF,30,0,INF},
            {INF,INF,INF,3,INF,0}};
            Dijkstra(cost,1,6);
            return 1;
            }


            如上圖:

             

             

            假設1為起始點

            我們會這樣想比喻1 ->0  我們會比較 1->0  2點直接相同不如果不相同我們肯定找別的通往0(也肯定要以1為起始點的撒)點 ---》所以1->2->0 這樣就得到了。

             

            其實這就是最短路徑的思路了 反正我學習的2個算法 Dijkstra Floyed 算法都是差不多這個思路。

             

            我們貪心法恰好就是這個思路 我們找到起始點 這里是1 到各個點這里是0 , 2,3 路徑距離 然后修改到各個點的值 dist[i]--我們認為dist 放都是最短距離)。。這樣就會得到我們想要結果了

            如我們這個例子:1—0 : 我們會開始的時候初始化 1->0 直接是為INF 無窮大 不通撒

            1--3 是不是1 到各個點最短的不 不是 我們再找知道最短  這里是1 2是最短的

            這里我們就修改1->0值是dist[0] =60+102;1->3 dist[3] =60+300;形成新dist。。

            然后以繼續上面重復。。。。。。。。。

            所以1 –2-0

            這里我畫圖只畫了這幾個 所以 不能很好說明


            ————————————————————————————————

            弗洛伊德 思路起始也是差不多 只是邊邊 上面是點到點


             //遞歸打印

            void printPath(int start,int end,int path[][MAXVEX])

            {

            if(end != -1)

            {

            end = path[start][end];

            printPath(start,end,path);

            if(end!=-1)

            cout<<end<<" ";

            }

            }

            void Floyed(int cost[][MAXVEX],int n)

            {

            int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];

            int i,j,k,pre;


            for(i = 0; i < n; i++)

            for(j = 0; j < n; j++)

            {

            A[i][j] = cost[i][j];

            path[i][j] = -1;

            }


            for( k = 0; k < n; k++)

            {

            for( i = 0; i < n; i++)

            for( j = 0; j < n; j++)

            if(A[i][j] > (A[i][k] + A[k][j]))

            {

            A[i][j] = A[i][k] + A[k][j];

            path[i][j] = k;

            }


            }

            printf("\n Floyed算法求解:\n");

            for( i = 0; i < n; i++)

            for(j = 0; j < n; j++)

            if(i!=j)

            {

            printf("  %d->%d:",i,j);

            if( A[i][j] == INF)

            {

            if(i!=j)

            printf("不存在路徑\n");

            }

            else

            {

            printf("路徑長度為:%3d",A[i][j]);

            printf("路徑為%d ",i);

            pre = path[i][j];

            //////////////////

            int stack[MAXVEX] = {0};

            int top = -1;

            //這里簡單的棧 書上代碼是錯誤的 打印是不對的 那本書的作者肯定是搞混了

            ////////////////

            /*while(pre != -1)

            {

            //printf("%d ",pre);

            stack[++top] = pre;

            pre = path[i][pre];

            }

            while(top!=-1)

            {

            printf("%d ",stack[top--]);

            }*/

            printPath(i,j,path); //這里用的遞歸打印路徑

            printf(" %d\n",j);

            }

            }

            }


            int main()

            {

            int cost[6][MAXVEX] ={

            {0,50,10,INF,INF,INF},

            {INF,0,15,50,10,INF},

            {20,INF,0,15,INF,INF},

            {INF,20,INF,0,35,INF},

            {INF,INF,INF,30,0,INF},

            {INF,INF,INF,3,INF,0}};


            //Dijkstra(cost,6,1);

            Floyed(cost,6);

            return 1;

            }

            posted on 2012-05-23 22:38 小魚兒 閱讀(273) 評論(0)  編輯 收藏 引用
            <2012年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(4)

            隨筆檔案(25)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久丫精品国产亚洲av不卡| 久久激情五月丁香伊人| 色综合久久无码五十路人妻| 久久精品国产99久久无毒不卡 | 91久久国产视频| 欧美成人免费观看久久| 亚洲AV日韩精品久久久久久| 国产精品美女久久久久AV福利| 91麻豆国产精品91久久久| 精品久久久噜噜噜久久久| 少妇久久久久久被弄到高潮| 99久久人妻无码精品系列| 精品99久久aaa一级毛片| 久久久无码一区二区三区| 久久无码一区二区三区少妇| 成人久久久观看免费毛片| 99久久无色码中文字幕人妻| 久久国产乱子伦精品免费午夜| 精品久久久久久亚洲精品| 2021国内精品久久久久久影院| 91精品国产综合久久香蕉 | 欧美日韩中文字幕久久久不卡| 久久天天躁狠狠躁夜夜躁2O2O| 麻豆久久| 亚洲国产精品综合久久网络| 国产伊人久久| 97精品伊人久久久大香线蕉| 狠狠色婷婷综合天天久久丁香| 久久人人爽人人爽人人AV东京热| 综合久久给合久久狠狠狠97色 | 久久99精品久久久久久不卡 | 久久久久高潮毛片免费全部播放| 久久精品国产欧美日韩99热| 久久亚洲精品无码播放| 色婷婷综合久久久久中文字幕 | 伊人久久大香线焦AV综合影院| 亚洲精品国精品久久99热| 国产精品99久久久精品无码| 综合久久精品色| 日韩精品久久久久久久电影蜜臀| 99久久国产宗和精品1上映 |