【2019暑假刷题笔记-图的存储和图的遍历】绪论(代码模板-总结自《算法笔记》)
生活随笔
收集整理的這篇文章主要介紹了
【2019暑假刷题笔记-图的存储和图的遍历】绪论(代码模板-总结自《算法笔记》)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、圖的存儲
以DFS法遍歷圖:
/* 偽碼思想:不管是鄰接表還是鄰接矩陣都是采用這種辦法的(注:連通圖一次DFS解決) */ DFS(u){ //訪問定點uvis[u]=true; //設(shè)置u被訪問過了for(從u出發(fā)能到達的所有頂點v) //枚舉從u出發(fā)的所有頂點vif vis[v]==false //如果v沒有被訪問過DFS(v); }DFSTrave(G){ //遍歷Gfor(G的所有頂點u) //對G的所有頂點uif vis[u]==false //如果u未被訪問DFS(u); //訪問u所在的連通塊 } /* 鄰接矩陣版DFS *///首先定義MAXV為最大頂點數(shù)、INF為一個很大的數(shù)字 const int MAXV=1000; const int INF=1000000000;int n,G[MAXV][MAXV]; //n為頂點數(shù),MAXV為最大頂點數(shù) bool vis[MAXV]={false}; void DFS(int u,int depth){vis[u]=true; //設(shè)置u已被訪問//如果需要對u進行一些操作,可以在這里進行//下面對所有從u出發(fā)能到達的分支頂點進行枚舉for(int v=0;v<n;v++){ //對每個頂點vif(vis[v]==false&&G[u][v]!=INF){ //如果v沒有被訪問且u可以達到vDFS(v,depth+1); //訪問v,深度加1}} }void DFSTrave(){ //遍歷圖Gfor(int u=0;u<n;u++){ //對每個頂點uif(vis[u]==false){ //若u沒有被訪問過DFS(n,1); //訪問u和u所在的連通塊,1表示初試的第一層}} } /* 鄰接表版 */ const int MAXV=1000; vector<int> Adj[MAXV]; //圖G的鄰接表 int n; //n為頂點數(shù),MAXV為最大頂點數(shù) bool vis[MAXV]={false}; //若頂點i已經(jīng)被訪問過了,則vis[i]==true.初值為falsevoid DFS(int u,int depth){ //u為當前訪問的頂點標號,depth為深度vis[u]=true; //設(shè)置u已經(jīng)被訪問//如果需要對u進行一些操作,可以在此處進行for(int i=0;i<Adj[u].size();i++){ //對從u出發(fā)可以到達的所有頂點vint v=Adj[u][i];if(vis[v]==false){ //若v沒有被訪問過DFS(v,depth+1); //訪問v,深度+1}} }void DFSTrave(){ //遍歷圖Gfor(int u=0;u<n;u++){ //對每個頂點uif(vis[u]==false){ //若u未被訪問DFS(u,1); //訪問u和u所在的聯(lián)通塊,1表示初始值為第一層}} }?
以BFS法遍歷圖:
/* 偽碼思想 */ BFS(u){ //遍歷u所在的連通塊queue q;將u入隊;inq[u]=true; //設(shè)置u已經(jīng)被加入過隊列while(q非空){ //只要隊列非空取出q的隊首元素u進行訪問for(u出發(fā)可達的所有頂點v){ //枚舉從u所能直接到達的頂點vif(inq[v]==false){ //若v未曾加入過隊列將v入隊inq[v]=true; //設(shè)置v已被加入過隊列}}} }BFSTrave(){ //遍歷圖Gfor(G的所有頂點u) //枚舉G的所有頂點uif(inq[u]==false){ //若u未曾加入過隊列BFS(G); //遍歷u所在的連通塊} } /* 鄰接矩陣版 */ int n,G[MAXV][MAXV]; //n為頂點數(shù),MAXV為最大頂點數(shù) bool inq[MAXV]=false; //若頂點i曾入過隊列,則inq[i]==true。初值為falsevoid BFS(int u){ //遍歷u所在的連通塊queue<int> q; //定義隊列qq.push(u); //將初始點u入隊inq[u]=true; //設(shè)置u已經(jīng)進入過隊列while(!q.empty()){ //只要隊列非空int u=q.front(); //取出隊首元素q.pop(); //將隊首元素出隊for(int v=0;v<n;v++){ if(inq[v]==false&&G[u][v]!=INF){ //若u的鄰接點v未曾加入過隊列q.push(v); //將v入隊inq[v]=true; //標記v為已經(jīng)被加入過隊列}}} }void BFSTrave(){ //遍歷圖Gfor(int u=0;u<n;u++){ //枚舉所有頂點if(inq[u]==false){ //若u未曾加入過隊列BFS(q); //遍歷u所在連通塊}} } /* 鄰接表版 */ vector<int> Adj[MAXV]; //圖G,Adj[u]存放從頂點u出發(fā)可以到達的所有頂點 int n; //n為頂點數(shù),MAXV為最大頂點數(shù) bool inq[MAXV]={false}; //若頂點i曾入過隊列,則inq[i]==true。初值為falsevoid BFS(int u){ //遍歷u所在的連通塊queue<int> q; //定義隊列qq.push(u); //將初始點u入隊inq[u]=true; //設(shè)置u已經(jīng)進入過隊列while(!q.empty()){ //只要隊列非空int u=q.front(); //取出隊首元素q.pop(); //將隊首元素出隊for(int i=0;i<Adj[u].size();i++){ //枚舉從u出發(fā)能到達的所有頂點int v=Adj[u][i]; if(inq[v]==false){ //若u的鄰接點v未曾加入過隊列q.push(v); //將v入隊inq[v]=true; //標記v為已經(jīng)被加入過隊列}}} }void BFSTrave(){ //遍歷圖Gfor(int u=0;u<n;u++){ //枚舉所有頂點if(inq[u]==false){ //若u未曾加入過隊列BFS(q); //遍歷u所在連通塊}} }?
/* 鄰接表版,設(shè)置層號和編號 */ struct Node{int v;int layer; }vector<Node> Adj[MAXV]; //圖G,Adj[u]存放從頂點u出發(fā)可以到達的所有頂點 int n; //n為頂點數(shù),MAXV為最大頂點數(shù) bool inq[MAXV]={false}; //若頂點i曾入過隊列,則inq[i]==true。初值為falsevoid BFS(int s){ //遍歷s為起編號queue<Node> q; //定義隊列qNode start;start.v=s;start.layer=0;q.push(start); //將初始點start入隊inq[start.v]=true; //設(shè)置start已經(jīng)進入過隊列while(!q.empty()){ //只要隊列非空Node topNode=q.front(); //取出隊首元素q.pop(); //將隊首元素出隊int u=topNode.v; //隊首頂點的編號for(int i=0;i<Adj[u].size();i++){ //枚舉從u出發(fā)能到達的所有頂點int next=Adj[u][i]; next.layer=topNode.layer+1;if(inq[next.v]==false){ //若next的鄰接點v未曾加入過隊列q.push(next); //將next入隊inq[next.v]=true; //標記next為已經(jīng)被加入過隊列}}} }void BFSTrave(){ //遍歷圖Gfor(int u=0;u<n;u++){ //枚舉所有頂點if(inq[u]==false){ //若u未曾加入過隊列BFS(q); //遍歷u所在連通塊}} }?
總結(jié)
以上是生活随笔為你收集整理的【2019暑假刷题笔记-图的存储和图的遍历】绪论(代码模板-总结自《算法笔记》)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【堆】堆的基本操作总结
- 下一篇: 【计算机网络(微课版)】第5章 传输层