亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言尋找無向圖兩點間的最短路徑

2020-01-26 13:33:52
字體:
來源:轉載
供稿:網友

1.簡介

無向圖是圖結構的一種。本次程序利用鄰接表實現無向圖,并且通過廣度優先遍歷找到兩點之間的最短路徑。

2.廣度優先遍歷

廣度優先遍歷(BFS)和深度優先遍歷(DFS)是圖結構中最常用的遍歷方式。其中廣度優先遍歷配合上隊列能夠找到兩點之間的最短路徑,同時也能解決一些其他的問題(比如尋找迷宮的最短逃離路線)。廣度優先遍歷尋找兩點之間最短路徑的操作分為以下幾步: 

1).首先定義起始點和終點src和dst。接著定義一個數組distance[ ],用于存放各點到src的距離。初始化時各點到src的距離是INF(表示正無窮。這里可自行定義,作用是表示還未得到該結點到src的距離),而distance[src] = 0。然后將src放入隊列。

2).取出隊列的第一個結點(一開始隊列只有src,這里就是取出src)放在變量top中;

3).獲得該結點的所有鄰接結點,并且判斷distance[ ]數組中各個鄰接結點是否為INF。如果是說明還沒有訪問過該結點則將distance[ ]相應的位置設定為distance[top] + 1。如果不為INF,則表示之前已經訪問過了,因此跳過。

4).重復2-3步直到top變量等于dst為止?;蛘咭恢钡疥犃袨榭?,這種情況下說明兩點間不存在路徑。

總結起來就是將結點從src開始按順序放進隊列中,而已經放進過隊列的結點會被標識,因此不會重復放進隊列,直到找到dst為止。這種方法得到的路徑一定時最短路勁。 

3.輸出最短路徑

上面使用廣度優先遍歷找到的是兩點之間最短路徑的長度,并且存儲在了distance[dst]中,而如果要輸出這條最短路徑有不同的方法。本人這里使用的方法是先將dst壓入棧中,然后通過遍歷dst的鄰接結點中有哪一個結點在distance數組中的值是distance[dst] - 1,找到后壓入棧中。接著繼續尋找再前一個結點,同樣壓入棧中。循環該操作最后找到src,然后將棧中的元素依次pop出來。因為棧先進后出的性質,便能夠得到該條路徑。 

4.代碼實現

具體的代碼如下

#ifndef _GRAPH_H#define _GRAPH_H #include <stack>#include <iostream>#include <queue> #define ERROR   -1#define V_E_INFO  1#define FIND    1#define PATH    2#define MAX     100 using namespace std;   class ArcNode{  private:    int value;    ArcNode *next;    public:    ArcNode(int , ArcNode * = nullptr);    void set_next(ArcNode *);    ArcNode *get_next() const;    int get_value() const;    void set_value(int);};   class List{    private:    int value;    ArcNode *firstnode;  public:    List(int = 0,ArcNode * = nullptr);    ~List();    ArcNode *Pop();    void Push(int);    int get_value() const;    int is_exist(int) const;    ArcNode *get_firstnode() const;    void set_value(int);    void dfs_find_path() const;    void set_firstnode(ArcNode *);    void print() const;};   class Graph{      private:    List list[MAX];    int vertices_num;    int edge_num;    public:    Graph(int,int,int []);    ~Graph();    int get_vertices_num() const;    int get_edge_num() const;    List *get_list(int);    void print() const;    void dfs_print_path(int,int) const;    void dfs_find_path(int,int,int [],stack<int> & ,int &) const;    void dfs(int src,int visited[],int &count) const;    void dfs_print(int) const;    void dfs_non_recursive() const;    int find_shortest_path(int,int) const;    void dfs(int,int []) const;}; #endif

BFS找尋最短路徑代碼:

int Graph::find_shortest_path(int src,int dst) const{  queue<int> myQ;   int value[vertices_num];/用于存放各點到src的距離  int head = 0;  int output[10];  for(int i = 0;i < vertices_num;i++)  {    value[i] = -1;//-1表示還沒有訪問過該結點  }   value[src] = 0;  myQ.push(src);   while(myQ.size())  {    head = myQ.front();    myQ.pop();    if(head == dst)    {      int find = dst;      stack<int> myS;      myS.push(dst);      while(find != src)      {          for(int j = 0; j < vertices_num; j++)        {          if((list[j].is_exist(find) == 1) && (value[find] == value[j] + 1))          {            myS.push(j);            find = j;            break;          }        }      }      int count = myS.size();      for(int j = 0;j < count;j++)      {        if(j == count - 1)          cout << myS.top() << endl;        else        {          cout << myS.top() << "-";          myS.pop();        }      }          return FIND;    }        ArcNode *a = list[head].get_firstnode();    while( a != nullptr)    {      if(value[a -> get_value()] == -1)      {        value[a -> get_value()] = value[head] + 1;        myQ.push(a -> get_value());      }      a = a -> get_next();    }  }  cout << "Error: no path between " << src << " and " << dst << endl;  return ERROR;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产成人高清视频| 日韩av在线网页| 国产精品久久久久aaaa九色| 国产精品视频久久久| 欧美午夜视频在线观看| 国内精品久久久| 亚洲成av人影院在线观看| 久久精品国产69国产精品亚洲| 一区二区三区四区视频| 在线播放国产一区二区三区| 久久久久久69| 亚洲人成电影网站色| 中文字幕亚洲欧美日韩2019| 91国产中文字幕| 亚洲精品免费网站| 久久久视频在线| 亲子乱一区二区三区电影| 国产精品久久久久久久午夜| 日韩av电影手机在线观看| 国产综合在线观看视频| 日韩成人免费视频| 人九九综合九九宗合| 欧美又大又粗又长| 91热精品视频| 欧美一级视频免费在线观看| 国内精品久久久久久中文字幕| 久久久久久久爱| 欧美老少配视频| 国产福利视频一区| 日韩在线视频播放| 欧美最猛性xxxx| 亚洲国产婷婷香蕉久久久久久| 国色天香2019中文字幕在线观看| 日韩精品极品在线观看| 91国产视频在线播放| 亚洲国产高清福利视频| 色中色综合影院手机版在线观看| 久久久久久久久久久网站| 亚洲一区久久久| 国产精品视频免费在线观看| 亚洲一区www| 2019中文字幕免费视频| 欧美自拍大量在线观看| 国产999精品久久久| 91夜夜未满十八勿入爽爽影院| 一区二区三区视频免费| 中文字幕一区二区三区电影| 久久精品亚洲94久久精品| 久青草国产97香蕉在线视频| 九九久久精品一区| 国产日韩欧美影视| 亚洲人成网站777色婷婷| 国产精品第三页| 久久精品91久久香蕉加勒比| 成人欧美一区二区三区黑人孕妇| 欧美成人午夜影院| 国模视频一区二区| 成人av在线网址| 奇门遁甲1982国语版免费观看高清| 成人免费看吃奶视频网站| 日韩一区av在线| 国产精品久久久久久影视| 日韩av在线网站| 国产精品三级久久久久久电影| 91av成人在线| 国产综合视频在线观看| 国产精品久久久| 中文字幕亚洲一区二区三区五十路| 亚洲精品国产综合久久| 在线观看日韩欧美| 欧美壮男野外gaytube| 91香蕉电影院| 色99之美女主播在线视频| 91国产中文字幕| 最近2019中文免费高清视频观看www99| 中文字幕日韩av综合精品| 国产综合视频在线观看| 久久精品国产2020观看福利| 亚洲精品美女免费| 欧美电影在线观看完整版| 国产91精品青草社区| 国产91在线播放| 亚洲精品久久久久久久久| 国产精品第100页| 国产亚洲xxx| 欧美孕妇孕交黑巨大网站| 国产小视频91| 久久国产精品久久久| 亚洲欧美日韩精品久久奇米色影视| 欧美国产日本在线| 日本不卡免费高清视频| 性色av一区二区咪爱| 国产做受高潮69| 亚洲丝袜一区在线| 国产拍精品一二三| 久久久久久亚洲| 亚洲欧美另类在线观看| 国产亚洲精品一区二555| 日韩在线免费视频观看| 亚洲天堂av在线免费观看| 国产在线视频一区| 亚洲成人精品视频| 日韩av高清不卡| 青草青草久热精品视频在线观看| 欧美成人午夜剧场免费观看| 国产精品视频1区| 国产日韩在线精品av| 成人免费在线视频网址| 高跟丝袜欧美一区| 欧美性受xxxx黑人猛交| 日韩av在线影院| 亚洲精品在线看| 色综合伊人色综合网站| 91嫩草在线视频| 黄色成人av在线| 亚洲欧美国产日韩天堂区| 国产伊人精品在线| 欧美孕妇性xx| 精品久久久久久久久久久久久| 亚州国产精品久久久| 夜夜躁日日躁狠狠久久88av| 亚洲一区中文字幕| 精品国产网站地址| xx视频.9999.com| 亚洲色图15p| 久久久久久久久久久久久久久久久久av| 在线精品视频视频中文字幕| 国产成人精品电影久久久| 欧美性猛交视频| 情事1991在线| 亚洲已满18点击进入在线看片| 日韩动漫免费观看电视剧高清| 91精品国产网站| 中文字幕亚洲综合久久筱田步美| 国产精品香蕉在线观看| 欧美午夜激情小视频| 91亚洲一区精品| 中文字幕亚洲欧美一区二区三区| 中文字幕免费国产精品| 亚洲精品第一国产综合精品| 欧美精品一本久久男人的天堂| 中文字幕亚洲二区| 精品久久久久久久大神国产| 91亚洲一区精品| 亚洲欧洲在线观看| 色悠悠久久久久| 国产91亚洲精品| 国产成人+综合亚洲+天堂| 视频在线观看一区二区| 亚洲欧美制服中文字幕| 国产丝袜精品视频| 国产成人一区二区三区电影| 精品少妇v888av| 日韩美女在线观看一区| 成人黄色网免费| 成人午夜小视频| 欧美裸体xxxx极品少妇软件| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲男人天天操| 国产成人精品视频| 成人免费视频97| 91成人性视频| 国产精品免费一区| 国内精品久久久久影院 日本资源|