雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

C++實現(xiàn)圖的鄰接表存儲和廣度優(yōu)先遍歷實例分析

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

本文實例講述了C++實現(xiàn)圖的鄰接表存儲和廣度優(yōu)先遍歷方法。分享給大家供大家參考。具體如下:

示例:建立如圖所示的無向圖

由上圖知,該圖有5個頂點,分別為a,b,c,d,e,有6條邊.

示例輸入(按照這個格式輸入):

5
6
abcde
0 1
0 2
0 3
2 3
2 4
1 4

輸入結(jié)束(此行不必輸入)

注:0 1表示該圖的第0個頂點和第1個定點有邊相連,如上圖中的a->b所示
      0 2表示該圖的第0個頂點和第2個定點有邊相連,如上圖中的a->c所示
      2 3表示該圖的第2個頂點和第3個定點有邊相連,如上圖中的c->d所示

實現(xiàn)代碼如下:

#include <stdio.h>
#include <malloc.h>
#define MAX_VEX 50
typedef struct NODE
{
 int ix; /* 頂點的索引 */
 struct NODE *next; /* 下一個表結(jié)點 */
}EdgeNode; /* 表結(jié)點 */
typedef struct
{
 char vex;
 EdgeNode *first; /* 第一個表結(jié)點 */
}Vertex; /* 表頭結(jié)點 */
typedef struct
{
 Vertex vex[MAX_VEX];
 int n,e;
}GRAPH;
void Create(GRAPH *G);
void BFS(GRAPH *G,int k); /* 廣度優(yōu)先遍歷 */
int main(int argc, char *argv[])
{
 GRAPH G;
 Create(&G);
 BFS(&G,0);
 
 return 0;
}
void BFS(GRAPH *G,int k)
{
 EdgeNode *p;
 int queue[MAX_VEX]; /* 循環(huán)隊列 */
 int front = -1,rear = -1,amount = 0;
 int visited[MAX_VEX];
 int i,j;
 for(i = 0 ; i < MAX_VEX ; ++i)
  visited[i] = 0;
  
 printf("訪問頂點:%c\n",G->vex[k].vex);
 visited[k] = 1;
 rear = (rear + 1) % MAX_VEX; /* 入隊 */
 front = 0;
 queue[rear] = k;
 ++amount;
 
 while(amount > 0)
 {
  i = queue[front]; /* 出隊 */
  front = (front + 1) % MAX_VEX;
  --amount;
  p = G->vex[i].first;
  
  while(p)
  {
   if(visited[p->ix] == 0)
   {
    printf("訪問頂點:%c\n",G->vex[p->ix].vex);
    visited[p->ix] = 1;
    rear = (rear + 1) % MAX_VEX; /* 入隊 */
    queue[rear] = p->ix;
    ++amount;
   }
   p = p->next;
  }
  
 }
}
void Create(GRAPH *G)
{
 printf("輸入頂點數(shù):\n");
 scanf("%d",&G->n);
 printf("輸入邊數(shù):\n");
 scanf("%d",&G->e);
 getchar();
 EdgeNode *p;
 
 int i,j,k;
 for(i = 0 ; i < G->n ; ++i) /* 建立頂點表 */
 {
  scanf("%c",&G->vex[i].vex);
  G->vex[i].first = NULL;
 }
 
 for(k = 0 ; k < G->e ; ++k) /* 建立邊表 */
 {/* 類似于頭插法創(chuàng)建鏈表 */
  scanf("%d%d",&i,&j);
  p = (EdgeNode*)malloc(sizeof(EdgeNode));
  p->next = G->vex[i].first;
  p->ix = j;
  G->vex[i].first = p;
  
  p = (EdgeNode*)malloc(sizeof(EdgeNode));
  p->next = G->vex[j].first;
  p->ix = i;
  G->vex[j].first = p;
 }
}

希望本文所述對大家的C++程序設計有所幫助。

上一篇:C++獲取當前系統(tǒng)時間的方法總結(jié)

欄    目:C語言

下一篇:C++實現(xiàn)讀取圖片長度和寬度

本文標題:C++實現(xiàn)圖的鄰接表存儲和廣度優(yōu)先遍歷實例分析

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3101.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有