最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)圖的遍歷之深度優(yōu)先搜索實(shí)例

 更新時(shí)間:2014年09月16日 14:50:28   投稿:shichen2014  
這篇文章主要介紹了C語言實(shí)現(xiàn)圖的遍歷之深度優(yōu)先搜索實(shí)例,采用不同的方法實(shí)現(xiàn)了深度優(yōu)先搜索算法,有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下

DFS(Depth-First-Search)深度優(yōu)先搜索算法是圖的遍歷算法中非常常見的一類算法。分享給大家供大家參考。具體方法如下:

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;  

#define MAX_VERTEX_NUM 10

struct Node
{
 int adjvex;
 struct Node *next;
 int info;
};

typedef struct VNode
{
 char data;
 Node *first;
}VNode, AdjList[MAX_VERTEX_NUM];

struct Graph 
{
 AdjList vertices;
 int vexnum, arcnum;
};

int visited[MAX_VERTEX_NUM];

int locateVex(Graph G, char u)
{
 int i;
 for (i = 0; i < G.vexnum; i++)
 {
 if (u == G.vertices[i].data)
  return i;
 }

 if (i == G.vexnum)
 {
 printf("Error u!\n");
 exit(1);
 }

 return 0;
}

void createGraph(Graph &G)
{
 int i, j, k, w;
 char v1, v2, enter;

 Node *p;
 printf("input vexnum & arcnum:\n");
 scanf("%d", &G.vexnum);
 scanf("%d", &G.arcnum);
 printf("input vertices:\n");
 for (i = 0; i < G.vexnum; i++)
 {
 scanf("%c%c", &enter, &G.vertices[i].data);
 G.vertices[i].first = NULL;
 }

 printf("input Arcs(v1, v2, w):\n");
 for (k = 0; k < G.arcnum; k++)
 {
 scanf("%c%c", &enter, &v1);
 scanf("%c%c", &enter, &v2);
 scanf("%d", &w);
 i = locateVex(G, v1);
 j = locateVex(G, v2);
 p = (Node *)malloc(sizeof(Node));
 p->adjvex = j;
 p->info = w;
 p->next = G.vertices[i].first;
 G.vertices[i].first = p;
 }
}

void DFS(Graph &G, int v)
{
 Node *p;
 printf("%c", G.vertices[v].data);
 visited[v] = 1;
 p = G.vertices[v].first;

 while (p)
 {
 if (!visited[p->adjvex])
  DFS(G, p->adjvex);
 p = p->next;
 }
}

void DFSTranverse(Graph &G)
{
 for (int v = 0; v < G.vexnum; v++)
 visited[v] = 0;
 for (int v = 0; v < G.vexnum; v++)
 {
 if (!visited[v])
  DFS(G, v);
 }
}

int main()
{
 Graph G;
 createGraph(G);
 DFSTranverse(G);
}

再換一種方式來寫DFS。具體代碼如下:

#include <iostream>
#include <string>

using namespace std;

#define MAXLEN 10

struct Node
{
 int data;
 Node *next;
};

struct Link
{
 int count;
 string name;
 Node *head;
};

struct Graph
{
 Link link[MAXLEN];
 int vexnum;
 int arcnum;
};

int findIndex(Graph &G, string name)
{
 int index = -1;

 for (int i = 0; i < G.vexnum; i++)
 {
 if (G.link[i].name == name)
 {
  index = i;
  break;
 }
 }

 if (index == -1)
 cout << "error" << endl;
 
 return index;
}

void constructGraph(Graph &G)
{
 cout << "construct graph yooo" << endl;
 cout << "enter vexnum" << endl;
 cin >> G.vexnum;

 string array[] = {"v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"};
 const int size = sizeof array / sizeof *array;

 for (int i = 0; i < G.vexnum; i++)
 {
 G.link[i].name = array[i];
 G.link[i].head = NULL;
 }

 string leftName;
 string rightName;

 cout << "enter a pair" << endl;
 cin >> leftName >> rightName;
 while (leftName != "end" && rightName != "end")
 {
 int leftIndex = findIndex(G, leftName);
 int rightIndex = findIndex(G, rightName);

 Node *node = new Node;
 node->data = rightIndex;
 node->next = NULL;

 node->next = G.link[leftIndex].head;
 G.link[leftIndex].head = node;

 cout << "enter a pair" << endl;
 cin >> leftName >> rightName;
 }
}

bool flag[MAXLEN];

void DFSTranverse(Graph &G, int num)
{
 cout << G.link[num].name << " ";
 flag[num] = true;

 Node *head = G.link[num].head;
 while (head != NULL)
 {
 int index = head->data;
 if (!flag[index])
  DFSTranverse(G, index);
 head = head->next;
 }
}

void main()
{
 Graph G;
 constructGraph(G);
 for (int i = 0; i < MAXLEN; i++)
 flag[i] = false;
 DFSTranverse(G, 0);
}

DFS的迭代遍歷算法如下:

void DFS(Graph &G)
{
 stack<int> istack;
 istack.push(0);

 cout << G.link[0].name << " ";
 flag[0] = true;

 while (!istack.empty())
 {
 int index = istack.top();
 Node *head = G.link[index].head;

 while (head != NULL && flag[head->data] == true)
  head = head->next;

 if (head != NULL)
 {
  index = head->data;
  if (!flag[index])
  {
  cout << G.link[index].name << " ";
  flag[index] = true;
  istack.push(index);
  }
 }
 else
  istack.pop();
 }
}

感性的朋友可以測(cè)試運(yùn)行一下本文實(shí)例代碼以加深印象,相信本文所述對(duì)大家C程序算法設(shè)計(jì)的有一定的借鑒價(jià)值。

相關(guān)文章

  • VC++中HTControl控件類之CHTRichEdit富文本編輯控件實(shí)例

    VC++中HTControl控件類之CHTRichEdit富文本編輯控件實(shí)例

    這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個(gè)比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 基于Qt實(shí)現(xiàn)電子木魚小游戲

    基于Qt實(shí)現(xiàn)電子木魚小游戲

    今年最火爆的解壓小游戲電子木魚,現(xiàn)在許多軟件都上架了這個(gè)小程序。我在網(wǎng)上看了一下基本上都是用py和Java寫的,所以我用QT重新寫了一下,作為小白練手項(xiàng)目非常適合,快跟隨小編一起學(xué)習(xí)一下吧
    2023-01-01
  • C++中的RTTI機(jī)制詳解

    C++中的RTTI機(jī)制詳解

    這篇文章主要介紹了C++中的RTTI機(jī)制詳解,本文詳細(xì)的總結(jié)了RTTI的相關(guān)知識(shí),需要的朋友可以參考下
    2014-10-10
  • C語言#define定義宏的使用詳解

    C語言#define定義宏的使用詳解

    #define?機(jī)制包括了一個(gè)規(guī)定,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常稱為宏(macro)或定義宏(define?macro)。本文就來和大家聊聊宏的使用,需要的可以參考一下
    2022-10-10
  • 簡(jiǎn)述C++的復(fù)雜性

    簡(jiǎn)述C++的復(fù)雜性

    這篇文章主要介紹了簡(jiǎn)述C++的復(fù)雜性,幫助大家更好的理解和認(rèn)識(shí)c++編程語言,感興趣的朋友可以了解下
    2020-08-08
  • C語言折半查找法介紹及使用示例

    C語言折半查找法介紹及使用示例

    折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復(fù)上述步驟知道找到?標(biāo)key,下面這篇文章主要給大家介紹了關(guān)于C語言折半查找法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 四個(gè)例子說明C語言?全局變量

    四個(gè)例子說明C語言?全局變量

    這篇文章主要介紹了四個(gè)例子說明C語言?全局變量,全局變量是C語言語法和語義中一個(gè)很重要的知識(shí)點(diǎn),首先它的存在意義需要從三個(gè)不同角度去理解,下面來看看這三個(gè)不同的內(nèi)容分別是什么吧
    2022-04-04
  • OpenCV計(jì)算輪廓長(zhǎng)度/周長(zhǎng)和面積

    OpenCV計(jì)算輪廓長(zhǎng)度/周長(zhǎng)和面積

    這篇文章主要為大家詳細(xì)介紹了OpenCV計(jì)算輪廓長(zhǎng)度/周長(zhǎng)和面積,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ template用法案例詳解

    C++ template用法案例詳解

    這篇文章主要介紹了C++ template用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 淺析內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    淺析內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    當(dāng)在C中定義了一個(gè)結(jié)構(gòu)類型時(shí),它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對(duì)結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴這種布局
    2013-09-09

最新評(píng)論

宝鸡市| 静海县| 平邑县| 黄浦区| 甘孜县| 任丘市| 丹棱县| 定边县| 德庆县| 河东区| 伊春市| 利津县| 康定县| 新蔡县| 竹溪县| 平江县| 阿瓦提县| 莎车县| 南投市| 台北市| 阿克陶县| 京山县| 永丰县| 安吉县| 本溪市| 沿河| 建昌县| 沁源县| 巴中市| 双流县| 旌德县| 元朗区| 黄梅县| 兴隆县| 个旧市| 鹤岗市| 咸阳市| 贵德县| 建昌县| 平阳县| 封丘县|