图论算法整理
图算法专题的一些基础知识。
文章目录
一、图的遍历
- DFS
深度优先搜索:采用递归实现,访问当前节点,然后对于所有该节点的出边。如果出边的端点没有被访问过则递归访问该节点。
#include <iostream>
#include <vector>
using namespace std;
#define MAXV 1000
#define INF 1e9
//邻接矩阵版
int n;
int G[MAXV][MAXV];
bool vis[MAXV]={
false};
void dfs_adjmatrix(int u, int depth){
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF){
dfs_adjmatrix(v, depth+1);
}
}
}
void dfs_trave(){
for(int u=0;u<n;u++){
if(vis[u]==false){
dfs_adjmatrix(u, 1);
}
}
}
//邻接表版
vector<int> Adj[MAXV];
int n; //n为顶点数
bool vis[MAXV]={
false};
void dfs_adjvec(int u, int depth){
vis[u]=true;
for(int i=0;i<Adj[u].size();i++){
int v=Adj[u][i];
if(vis[v]==false){
dfs_adjvec(v, depth+1);
}
}
}
void dfsTrave_vec(){
for(int u=0;u<n;u++){
if(vis[u]==false){
dfs_adjvec(u, 1);
}
}
}
- BFS
使用队列实现广度优先遍历,先访问源点,再使用while循环,每次都将当前访问节点u的所有未访问过的邻接点加入到队列中去,直至队列为空。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
//邻接矩阵版
#define MAXV 1000
#define INF 1e9
int n, G[MAXV][MAXV];
bool inq_1[MAXV]={
false};
void BFS_1(int u){
queue<int> q;
q.push(u);
inq_1[u]=true;
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=0;v<n;v++){
if(inq_1[v]==false&&G[u][v]!=INF){
q.push(v);
inq_1[v]=true;
}
}
}
}
void bFSTrave_1(){
for(int u=0;u<n;u++){
if(inq_1[u]==false){
BFS_1(u);
}
}
}
//邻接表版
vector<int> Adj[MAXV];
int n;
bool inq_2[MAXV]={
false};
void BFS_2(int u){
queue<int> q;
q.push(u);
inq_2[u]=true;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<Adj[u].size();i++){
int v=Adj[u][i];
if(inq_2[v]==false){
q.push(v);
inq_2[v]=true;
}
}
}
}
void BFSTrave_2(){
for(int u=0;u<n;u++)