日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

连通图遍历策略之广度优先搜索(C语言)

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 连通图遍历策略之广度优先搜索(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

廣度優先搜素(BFS)

廣度優先搜索(又稱寬度優先搜索)算法是最簡便的圖的搜索算法之一,該算法屬于一種盲目搜尋法,目的是系統地展開并檢查圖中的所有節點,以找尋結果。換句話說,它并不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。

廣度優先搜素也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優先搜索類似的思想。

廣度優先搜素類似于樹的層次遍歷,遍歷結果不唯一
我們依據鄰接表進行遍歷,還需要借助到鏈隊的內容。

以如下連通圖為例:

構建其對應的鄰接表:

采用廣度優先搜素的遍歷順序如下:




程序運行時并非運行到這里就結束了,而是會繼續遍歷,只是進行判斷的時候visit[i]數組已經置為1,不需要繼續輸出了。
注:為了標定一個·頂點是否被遍歷過了,需要采用輔助數組visit[i]進行判定,沒當頂點被遍歷則將其對應的visit[i]置為1,避免重讀。


廣度優先搜索步驟:

  • 從某一頂點出發進行訪問,該點首先被讀入,visit[i]置為1
  • 依次訪問該點的鄰接點,將其加入隊列
  • 對每個鄰接點的鄰接點進行入隊操作
  • 注意:“先訪問頂點的鄰接點”應先于“后訪問頂點的鄰接點”
    這也是為什么要采用隊列這種結構存儲的原因:我們需要保證在一次遍歷中記錄下某一點的全部鄰接點,但是每個點卻又對應著自己的鄰接點,根據廣度優先搜索的要求,我們需要保證“先訪問頂點的鄰接點”應先于“后訪問頂點的鄰接點”,所以隊列是個不錯的輔助工具。我們根據隊列的順序就可以找出對應鄰接點的位置,進而確定它所對應的鄰接點。

    隊列變化:

    注:紅線劃去的代表該頂點的visit[i]=1,無需多次加入隊列。

    廣度優先搜索函數代碼:

    void BFSTraverse(AdjMatrix *G)//廣度優先搜索 {LinkQueue Q;for(int v=0;v<G->n;++v) visited[v]=false;InitQueue(&Q);printf("廣度優先搜索順序");for(int v=0;v<G->n;++v){if(!visited[v]){EnQueue(&Q,v);//將鄰接表的頂點元素入隊 while(!QueueEmpty(&Q)){int u; DeQueue(&Q,u);if(!visited[u]) {visited[u]=true;printf("->%c",G->adjlist[u].vertex);} //對該頂點元素的邊關系進行遍歷,依次入隊 for(EdgeNode *w=G->adjlist[u].edgenext;w;w=w->next)if(!visited[w->adjvex]) EnQueue(&Q,w->adjvex);}printf("\n\n"); }} }

    具體代碼如下:

    #include <stdio.h> #include <stdlib.h> #define MaxVertices 100 #define MAX_VERTEX_NUM 20 typedef struct node{ //邊表 int adjvex;node* next; }EdgeNode; typedef struct{ //頂點表 int vertex; EdgeNode* edgenext; }VertexNode; typedef VertexNode AdjList[MaxVertices]; typedef struct{ AdjList adjlist; int n,e; }AdjMatrix; typedef struct Qnode{ //鏈隊結點的類型int data;struct Qnode *next; }Qnode,*QueuePtr; typedef struct{ //鏈隊指針類型QueuePtr front;QueuePtr rear; }LinkQueue; int visited[MAX_VERTEX_NUM]; void InitQueue(LinkQueue *Q)//初始化鏈隊 {Q->front=Q->rear=(QueuePtr)malloc(sizeof(Qnode));if(!Q->front) exit(1); //存儲分配失敗Q->front->next=NULL;} void EnQueue(LinkQueue *Q,int e)//入隊 { QueuePtr p;p=(QueuePtr)malloc(sizeof(Qnode));p->data=e;p->next=NULL;Q->rear->next=p;Q->rear=p; } int QueueEmpty(LinkQueue *Q)//判斷隊空 {return(Q->front==Q->rear? 1:0); } void DeQueue(LinkQueue *Q,int &e)//出隊 { QueuePtr p;if(QueueEmpty(Q)){printf("\n Queue is free!");exit(1);}//ifp=Q->front->next;e=p->data;Q->front->next=p->next;if(Q->front->next==NULL) Q->rear=Q->front;free(p);} void CreateGraph(AdjMatrix* G)//構造圖 { int i,j,k,w,v; EdgeNode *s; printf("輸入頂點數和邊數(中間以空格分開):"); scanf("%d%d",&G->n,&G->e); printf("建立頂點表\n"); for (i=0;i<G->n;i++) { //fflush(stdin); //如果 stream 指向輸入流(如 stdin),那么 fflush 函數的行為是不確定的。//故而使用 fflush(stdin) 是不正確的。getchar(); printf("請輸入第%d個頂點的信息:",i+1);G->adjlist[i].vertex=getchar();G->adjlist[i].edgenext=NULL; } //前插法 printf("建立邊表\n"); for (k=0;k<G->e;k++) { printf("輸入有連接的頂點序號:"); scanf("%d%d",&i,&j); //對于直接相連的進行編入(即對輸入“0 1”時,在0對應的邊表中編入1) i-=1;j-=1; s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j;//邊表賦值 s->next=G->adjlist[i].edgenext; G->adjlist[i].edgenext=s; //對于間接相連的進行編入(即對輸入“0 1”時,在1對應的邊表中編入0)s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=i; s->next=G->adjlist[j].edgenext; G->adjlist[j].edgenext=s; } } void DispGraph(AdjMatrix *G)//銷毀圖 {int i;for (i=0;i<G->n;i++) { printf("%d->",i+1); while(1) { if(G->adjlist[i].edgenext==NULL){printf("^");break; }printf("%d->",G->adjlist[i].edgenext->adjvex+1); G->adjlist[i].edgenext=G->adjlist[i].edgenext->next; } printf("\n"); } } void BFSTraverse(AdjMatrix *G)//廣度優先搜索 {LinkQueue Q;for(int v=0;v<G->n;++v) visited[v]=false;InitQueue(&Q);printf("廣度優先搜索順序");for(int v=0;v<G->n;++v){if(!visited[v]){EnQueue(&Q,v);//將鄰接表的頂點元素入隊 while(!QueueEmpty(&Q)){int u; DeQueue(&Q,u);if(!visited[u]) {visited[u]=true;printf("->%c",G->adjlist[u].vertex);//visit一下} //對該頂點元素的邊關系進行遍歷,依次入隊 for(EdgeNode *w=G->adjlist[u].edgenext;w;w=w->next)if(!visited[w->adjvex]) EnQueue(&Q,w->adjvex);}printf("\n\n"); }} } int main() { //freopen("1.txt","r",stdin);AdjMatrix* G= (AdjMatrix*)malloc(sizeof(AdjMatrix)); CreateGraph(G);BFSTraverse(G); DispGraph(G); }

    測試數據如下:
    注:由于測試輸入數據較多,程序可以采用文件輸入

    5 7
    1
    2
    3
    4
    5
    1 2
    1 3
    1 4
    2 3
    2 4
    3 5
    4 5

    總結

    以上是生活随笔為你收集整理的连通图遍历策略之广度优先搜索(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精品影院在线 | av色播| 中文字幕亚洲一区二区三区五十路 | 日本在线免费观看 | 国产熟妇一区二区三区四区 | 日本十八禁视频无遮挡 | 91视频国产精品 | 在线观看免费人成视频 | 波多野结衣中文一区 | 亚洲无码精品一区二区三区 | 久久毛片网站 | 亚洲欧洲国产日韩 | 亚洲操操 | 激情全身裸吻胸 | 色哟哟国产精品色哟哟 | 爱爱视频天天干 | 男女激情视频网站 | 亚洲av永久无码精品 | 国产亚洲激情 | 波多野结衣视频免费观看 | 成人av小说 | 毛片毛片 | 丰满人妻一区二区三区精品高清 | 日韩黄色在线观看 | 成人久久久精品国产乱码一区二区 | 在线观看一区二区视频 | 大陆熟妇丰满多毛xxxⅹ | 午夜羞羞羞 | 女生扒开尿口让男生桶 | 懂色av一区二区三区免费观看 | 黑人爱爱视频 | 欧洲亚洲一区二区 | 国产破处在线 | 国产精品sm | 秋霞午夜影院 | 中文日本在线 | 性盈盈影院中文字幕 | 日本午夜免费福利视频 | 国产免费黄网站 | 免费在线看污片 | 中文字幕一区二区三区日韩精品 | 星铁乱淫h侵犯h文 | 欧美激情精品久久久久久蜜臀 | 成人一级在线 | 欧美二区在线观看 | 91精品国产综合久久福利 | 日韩精品一区二区三区无码专区 | 欧美综合精品 | 国产日韩欧美在线播放 | 手机看片1024日韩 | 强行无套内谢大学生初次 | 久久久高清 | 毛片123 | 激情www | 欧美日韩国产免费观看 | 婷婷综合激情 | 欧美色鬼 | 欧美精品一区视频 | av自拍一区 | 少妇一级淫免费观看 | 欧美成人黄色 | 国产精品中文 | 欧美美女一区二区 | 麻豆av免费在线 | 国产一区二区免费 | 亲女禁h啪啪宫交 | 四虎最新域名 | 亚洲乱妇 | 1000部啪啪未满十八勿入 | 中文字幕人乱码中文字 | www.好吊色 | 91视色| 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 日本国产在线 | 久久精品国产亚洲av高清色欲 | 日本黄色录象 | 国产成人在线免费视频 | 波多野结衣av在线免费观看 | 一区二区三区四区国产 | 色综合社区 | hd极品free性xxx护士 | 欧美日韩在线视频免费 | 国产精品扒开腿做爽爽爽视频 | 国产精品免费一区二区三区在线观看 | 天天插天天搞 | 神马午夜51 | 亚洲天堂午夜 | 国产视色 | 久久久久激情 | 黄色一级大片在线免费看产 | 日韩精品免费一区二区在线观看 | 日本福利一区二区 | 色老大视频 | 亚洲高清久久 | 国产探花一区二区 | 国产精品欧美性爱 | 九九碰 | 夜夜骑夜夜操 | 日韩中文字幕在线不卡 |